Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用dataframe的行值替换子列表中的第二项_Python_List_Pandas_For Loop_Dataframe - Fatal编程技术网

Python 用dataframe的行值替换子列表中的第二项

Python 用dataframe的行值替换子列表中的第二项,python,list,pandas,for-loop,dataframe,Python,List,Pandas,For Loop,Dataframe,我有一个嵌套列表,希望用dataframe的行值替换每个子列表的第二项。以下是我的数据框架和列表: import pandas as pd mydata = [{'id' : '12'}, {'id' : '34'}, {'id' : '56'}, {'id' : '78'},] df = pd.DataFrame(mydata) L1 = [ ['elephant',0], ['zebra',1], ['lion',2], ['gi

我有一个嵌套列表,希望用dataframe的行值替换每个子列表的第二项。以下是我的数据框架和列表:

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]  ]
理想的结果是:
[['大象',12],'斑马',34],'狮子',56],'长颈鹿',78]

这是我的代码:

for i in L1:
    for j, row in df.iterrows():
        i[1] = df["id"][j] 

它的输出:
[['elephant','78'],['zebra','78'],['lion','78'],['giraffe','78']]
使用列表理解生成第一个元素的列表,然后使用id列生成它们:

In[32]:
list(zip([x[0] for x in L1], df['id'].tolist()))

Out[32]: [('elephant', '12'), ('zebra', '34'), ('lion', '56'), ('giraffe', '78')]
如果您坚持要列表,您可以将上述内容转换为列表:

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']]
一种纯粹的方法是从列表中构造df:

In[41]:
df2 = pd.DataFrame(L1)
df2

Out[41]: 
          0  1
0  elephant  0
1     zebra  1
2      lion  2
3   giraffe  3
然后启用它们:

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
然后只需再选择感兴趣的列并调用以返回np数组,然后
tolist

In[46]:
merged[[0,'id']].values.tolist()

Out[46]: [['elephant', '12'], ['zebra', '34'], ['lion', '56'], ['giraffe', '78']]

埃德彻姆的回答当然是正确的,但对发生的事情几乎没有解释。我将解释您现有的代码有什么问题,以及相应的步骤。(我的答案与Ed的答案基本相同,但不同。我没有测试哪一个更有效,但我的答案可能更容易理解。)

为什么每个值都设置为78?您的代码执行以下操作:

for i in L1:
    for j, row in df.iterrows():
        i[1] = df["id"][j] 
这意味着,对于
L1
中的每个
i
,遍历
df
中的每一行,并将
i[1]
设置为该行的
“id”
。这意味着在这种情况下,您为每个
i
设置了4次
i[1]
,在循环结束时,它始终是最后一个值,因此
'78'
。您需要根据
i[1]
的当前值选择性地设置
i[1]

您可以按如下方式修改循环:

for i in L1:
    i[1] = df["id"][i[1]]
这会就地修改每个列表
i
,将其第二个值设置为带有原始
i[1]
编号的
df[“id”]
。这将产生您想要的结果

不过,这不是很像蟒蛇。一般来说,我们尽量避免python中的基本循环。最简洁的使用方法是列表理解,只是没有Ed的那么复杂:

L1 = [[i[0], df["id"][i[1]]] for i in L1]
这与上面的循环相同,只是使用列表理解语法(因此速度会快得多)。对于此功能,使用
zip
是非常好的,但没有必要


(注意,我的解决方案根本不使用pandas。)

回答不错,在某些情况下,列表理解会更快,尤其是对于小数据集,如果数据集更大并且已经在df中,那么调用
.values.tolist()
应该会比我预期的+1快得多