[英]how to groupby or aggregate Pandas dataframe without an operation
我有一个涉及 Pandas DataFrame 的具体情况如下:
df = pd.DataFrame({'col1': ['group1','group1','group1'], 'value1':[0,0,0],'value2':['A','B','C']})
在这里,0 值可以解释为整个列的“空白”或 NaN。
我要做的就是“按”“col1”值“分组”,在这种情况下它只是“group1”,并获得一个 dataframe 具有:
您可以尝试使用set
:
import pandas as pd
df = pd.DataFrame({'col1': ['group1','group1','group1'], 'value1':[0,0,0],'value2':['A','B','C']})
print(df.groupby('col1').agg(set).reset_index())
Output:
col1 value1 value2
0 group1 {0} {A, C, B}
或者,如果您想将其保留为列表,您可以尝试以下操作:
print(df.groupby('col1').agg(set).applymap(list).reset_index())
Output:
col1 value1 value2
0 group1 [0] ['A', 'C', 'B']
此外,如果您想在没有列表的情况下保留唯一编号,您可以尝试:
print(df.groupby('col1').agg(lambda x: x[0] if len(set(x))==1 else list(x)).reset_index())
Output:
col1 value1 value2
0 group1 0 [A, B, C]
这是一个想法,有点过于复杂,但它完成了工作:
import pandas as pd
df = pd.DataFrame({'col1': ['group1','group1','group1'], 'value1':[0,0,0],'value2':['A','B','C']})
df_grouped = pd.DataFrame({x:str(list(set(df[x].values.tolist()))) for x in df},index=[0])
Output:
col1 value1 value2
0 ['group1'] [0] ['C', 'B', 'A']
但是,使用str
强制所有内容都在一行中并避免索引错误,因为 arrays 的长度不同,可以使用ast.literal_eval()
撤消,将值返回到列表而不是字符串:
df_grouped = df_grouped.T
df_grouped = df_grouped[0].map(lambda x:ast.literal_eval(x)).to_frame().T
终于回来了:
col1 value1 value2
0 [group1] [0] [C, B, A]
但是使用正确的值类型(列表):
print(type(df_grouped.loc[0,'col1']))
Output:
<class 'list'>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.