如何遍历数据帧中的列表?

时间:2019-06-05 11:05:08

标签: python python-3.x pandas

我正在尝试遍历包含多个列表的数据框列,并控制列表中的值是否由另一个数据框列所包含。

我是python的新手,现在已经有较长时间了。我已经尝试过用isinstr.contains解决此问题的方法,但是我仍然找不到匹配的对象。

这是到目前为止我制定的代码:

data = [['yellow', 10,0], ['red', 15,0], ['blue', 14,0]] 
df1 = pd.DataFrame(data, columns = ['Colour', 'Colour_id','Amount'])
df1

 Colour  Colour_id   Amount
 yellow  10          0
 red     15          0
 blue    14          0

data = [['tom',[10,15],200 ], ['adam', [10],50], ['john',[15,14],200]] 
df2 = pd.DataFrame(data, columns = ['Colour', 'Colour_id','Amount'])
df2 

 Name   Colour_id   Amount
 tom    [10,15]     200
 adam   [10]        50
 john   [15,14]     200


for indices, row in df2.iterrows():
    for i in row['Colour_id']:
        if i in df1['Colour_id']:
            df1['Amount']=df1['Amount']=df2['Amount']
        else:
            print("No")

预期结果应该是df1的“金额”列被填充为:

Colour  Colour_id   Amount
 yellow  10          250
 red     15          400
 blue    14          200

此刻,我仅获得else条件的“否”。

1 个答案:

答案 0 :(得分:0)

通过将列表列转换为DataFrame,通过stack重塑并聚合sumSeries.map来创建序列的想法:

df3 = pd.DataFrame(df2['Colour_id'].values.tolist(), index=df2['Amount']).stack().reset_index()
s = df3.groupby(0)['Amount'].sum()

df1['Amount'] = df1['Colour_id'].map(s)
print (df1)
   Colour  Colour_id  Amount
0  yellow         10     250
1     red         15     400
2    blue         14     200

或者将defaultdict与纯python fo字典结合使用,将值求和,并将map用于新列:

from collections import defaultdict

d = defaultdict(int)
for cid, Amount in zip(df2['Colour_id'], df2['Amount']):
    for x in cid:
        d[x] += Amount

print (d)
defaultdict(<class 'int'>, {10: 250, 15: 400, 14: 200})

df1['Amount'] = df1['Colour_id'].map(s)
print (df1)
   Colour  Colour_id  Amount
0  yellow         10     250
1     red         15     400
2    blue         14     200