Python列表:对于每个列,一个值显示所有ColumnB值

时间:2018-02-03 12:16:01

标签: python json pandas

我有一个Dataframe,我正在尝试组合两列(一列有数字ID,另一列有字符串)。那么,让我们举一个例子:

enter image description here

我要做的是创建一个列表,显示columnA的每个值的所有columnB值(只是粘贴excel版本而不是列表输出):

enter image description here

最初那是我的代码:

#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)

我回来了:

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为您需要按join所有字符串列进行汇总,例如ColumnBfirst,如果只需要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