繁体   English   中英

如何在没有操作的情况下分组或聚合 Pandas dataframe

[英]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 具有:

  • 'col1'('group1')下的一个值
  • 'value1' (0) 下的一个值
  • “value2”下的 3 个值(“A”、“B”、“C”)

您可以尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM