我有一个DataFrame
列表(我读过的每个文件一个)和一个字符串列表(文件的文件名)。我想在每个filename
中创建一个新列DataFrame
,并在文件名列表中为其指定相应的值。我的目标是在连接DataFrame
列表后确定数据来源。
df = pd.DataFrame({ 'A' : pd.Series(1,index=list(range(4)),dtype='float32'),
'B' : 'bar',
'C' : 'foo' })
list_df = [df,df,df]
file_names = ['source1','source2','source3']
我正在尝试这样做:
[x.loc[:,'filename'] = file for (x,file) in (list_df,file_names)]
这显然不起作用,因为在列表推导表达式(?)中不允许迭代元组。 For循环将是一个选项(但次优)。是否有可能使用列表理解来实现这一点并且是最有效的解决方案?
答案 0 :(得分:1)
使用zip()
函数,例如 -
for df_,file in zip(list_df,file_names):
df_.loc[:,'filename'] = file
但是如果你真的必须使用列表理解,你就不能在列表理解中使用赋值语句。除此之外,您可以尝试创建一个执行赋值的函数,并使用列表推导调用该函数。
您还需要zip()
数据框列表和file_names
列表,以便将元素放在相应的索引中。
示例 -
def func(df,file):
df.loc[:,'filename'] = file
[func(df_,file) for df_,file in zip(list_df,file_names)]
演示 -
In [54]: df = pd.DataFrame({ 'A' : pd.Series(1,index=list(range(4)),dtype='float32'),
....: 'B' : 'bar',
....: 'C' : 'foo' })
In [55]: list_df = [df,df,df]
In [56]: file_names = ['source1','source2','source3']
In [57]: def func(df,file):
....: df.loc[:,'filename'] = file
....:
In [58]: [func(df,file) for df,file in zip(list_df,file_names)]
Out[58]: [None, None, None]
In [59]: df
Out[59]:
A B C filename
0 1 bar foo source3
1 1 bar foo source3
2 1 bar foo source3
3 1 bar foo source3