我有一个Dataframe,我正在尝试组合两列(一列有数字ID,另一列有字符串)。那么,让我们举一个例子:
我要做的是创建一个列表,显示columnA的每个值的所有columnB值(只是粘贴excel版本而不是列表输出):
最初那是我的代码:
#Group the results by the columns given
scenario = df.groupby(['ColumnA', 'ColumnB', 'ColumnC', 'ColumnD']).agg({'Start_Date': 'min', 'End_Date': 'max', 'Number': 'sum', 'Number2': 'sum'})
scenario1 = list()
for row in scenario.itertuples():
scenario1.append(row[0][0]," ",row[0][1])
这又返回了这个错误:
+:'int'和'str'
的不支持的操作数类型
这是一个常见的。
所以,我也尝试了以下场景:
scenario1.append(row[0][0]," ",row[0][1])
错误:
append()只取一个参数(给定3个)
我发现了一个解决方案(未经100%测试):
scenario1.append(str(row[0][0])+" "+row[0][1])
当我试图找到解决方案时,我将数据帧转换为json:
json_data =json.loads(df.to_json(orient="records"))
scenario2 = [{"columna": x["ColumnA"], "columnb": x["ColumnB"]} for x in json_data if "columnC" in x and x["ColumnC"] == "one"]
print(scenario2)
返回一个空列表。请注意,我在这里添加了第三列的过滤器。我无法理解为什么这不起作用。
UPD:
在jezrael的回答之后我尝试编辑它:
df = pd.DataFrame({'columnA':[1111,1111,2222,3333,4444,4444,5555,6666],
'columnB':['AAAA','BBBB','AAAA','BBBB','AAAA','CCCC','BBBB','CCCC'],
'columnC':['one','one','one','one','one','one','two','one'],
'NUM1':[1,3,5,7,1,0,4,5],
'NUM2':[5,3,6,9,2,4,1,1],
'W':list('aaabbbbb')})
print (df)
d = {'columnB':lambda x: x.tolist(), 'columnC':'first'}
df1 = df.groupby('columnA').agg(d)
print (df1)
我回来了:
答案 0 :(得分:1)
我认为您需要按join
所有字符串列进行汇总,例如ColumnB
或first
,如果只需要ColumnC
这样的第一个值。
如果需要聚合list
使用lambda函数,例如ColumnD
:
d = {'Start_Date': 'min',
'End_Date': 'max',
'Number': 'sum',
'Number2': 'sum',
'ColumnB':', '.join,
'ColumnC':'first',
'ColumnD':lambda x: x.tolist()}
scenario = df.groupby(['ColumnA']).agg(d)
<强>示例强>:
df = pd.DataFrame({'A':list('abcdef'),
'B':list('abcdef'),
'C':list('abcdef'),
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
print (df)
A B C D E F
0 a a a 1 5 a
1 b b b 3 3 a
2 c c c 5 6 a
3 d d d 7 9 b
4 e e e 1 2 b
5 f f f 0 4 b
d = {'A':lambda x: x.tolist(), 'B':'first', 'C':','.join, 'D':'min'}
df1 = df.groupby('F').agg(d)
print (df1)
A B C D
F
a [a, b, c] a a,b,c 1
b [d, e, f] d d,e,f 0