app*_*ges 2 python for-loop list dataframe pandas
我有一个嵌套列表,并希望用数据帧的行值替换每个子列表的第二项.这是我的数据框和列表:
import pandas as pd
mydata = [{'id' : '12'},
{'id' : '34'},
{'id' : '56'},
{'id' : '78'},]
df = pd.DataFrame(mydata)
L1 = [ ['elephant',0], ['zebra',1], ['lion',2], ['giraffe',3] ]
Run Code Online (Sandbox Code Playgroud)
期望的结果是: [ ['elephant',12], ['zebra',34], ['lion',56], ['giraffe',78] ]
这是我的代码:
for i in L1:
for j, row in df.iterrows():
i[1] = df["id"][j]
Run Code Online (Sandbox Code Playgroud)
哪个输出: [['elephant', '78'], ['zebra', '78'], ['lion', '78'], ['giraffe','78']]
使用列表推导生成第一个元素的列表,然后zip使用id col:
In[32]:
list(zip([x[0] for x in L1], df['id'].tolist()))
Out[32]: [('elephant', '12'), ('zebra', '34'), ('lion', '56'), ('giraffe', '78')]
Run Code Online (Sandbox Code Playgroud)
如果你坚持列表列表,你可以将上面的内容变成一个列表:
In[35]:
L2 = list(zip([x[0] for x in L1], df['id'].tolist()))
L2
Out[35]: [('elephant', '12'), ('zebra', '34'), ('lion', '56'), ('giraffe', '78')]
In[36]:
[list(x) for x in L2]
Out[36]: [['elephant', '12'], ['zebra', '34'], ['lion', '56'], ['giraffe', '78']]
Run Code Online (Sandbox Code Playgroud)
一个纯粹的熊猫方法是从你的列表中构建一个df:
In[41]:
df2 = pd.DataFrame(L1)
df2
Out[41]:
0 1
0 elephant 0
1 zebra 1
2 lion 2
3 giraffe 3
Run Code Online (Sandbox Code Playgroud)
然后concat加入他们:
In[43]:
merged = pd.concat([df,df2], axis=1)
merged
Out[43]:
id 0 1
0 12 elephant 0
1 34 zebra 1
2 56 lion 2
3 78 giraffe 3
Run Code Online (Sandbox Code Playgroud)
然后简单地选择感兴趣的cols并调用.values返回一个np数组,然后tolist:
In[46]:
merged[[0,'id']].values.tolist()
Out[46]: [['elephant', '12'], ['zebra', '34'], ['lion', '56'], ['giraffe', '78']]
Run Code Online (Sandbox Code Playgroud)