示例Pandas Dataframe:
ID Name COMMENT1 COMMENT2 NUM 1 dan hi hello 1 1 dan you friend 2 3 jon yeah nope 3 2 jon dog cat .5 3 jon yes no .1
我正在尝试创建一个按ID和NAME分组的数据框,它连接COMMENT1和COMMENT2,它们也总和NUM。
这就是我正在寻找的:
ID Name COMMENT1 COMMENT2 NUM 1 dan hi you hello friend 3 3 jon yeah yes nope no 3.1 2 jon dog cat .5
我试过用这个:
input_df = input_df.groupby(['ID', 'NAME', 'COMMENT1', 'COMMENT2']).sum().reset_index()
但它没有用。
如果我使用它:
input_df = input_df.groupby(['ID']).sum().reset_index()
它将NUM列相加,但不包括所有其他列。
答案 0 :(得分:7)
让我们把它变成一行
df.groupby(['ID','Name'],as_index=False).agg(lambda x : x.sum() if x.dtype=='float64' else ' '.join(x))
Out[1510]:
ID Name COMMENT1 COMMENT2 NUM
0 1 dan hi you hello friend 3.0
1 2 jon dog cat 0.5
2 3 jon yeah yes nope no 3.1
答案 1 :(得分:0)
将您的数据示例转换为csv文件,我们可以执行以下操作:
import pandas as pd
def grouping_Cols_by_Cols(DF, grouping_Columns, num_Columns):
# numerical columns can mess us up ...
column_Names = DF.columns.tolist()
# so, convert all columns' values to strings
for column_Name in column_Names:
DF[column_Name] = DF[column_Name].map(str) + ' '
DF = DF.groupby(by=grouping_Columns).sum()
# NOW, convert the numerical string columns to an expression ...
for num_Col in num_Columns:
column_Names = DF.columns.tolist()
num_Col_i = column_Names.index(num_Col)
for i in range(len(DF)):
String = DF[num_Col].iloc[i]
value = eval(String.rstrip(' ').replace(' ','+'))
DF.iat[i,num_Col_i] = value
return DF
###############################################################
### Operations Section
###############################################################
df = pd.read_csv("UnCombinedData.csv")
grouping_Columns = ['ID','Name']
num_Columns = ['NUM']
df = grouping_Cols_by_Cols(df,grouping_Columns, num_Columns)
print df
通过更多的工作,定义的函数可以自动检测,哪些列中包含数字并将它们添加到数字列表中。
我认为这与this post中遇到的问题和挑战相似,但不完全一样。
答案 2 :(得分:0)
您还可以告诉.agg()
每列要使用哪些聚合函数,对于字符串列,请传递' '.join
(注意,由于您不想调用{ {1}},而是将其作为参数本身传递):
.join