Python - 列表理解表达式,用于将值从列表分配到DataFrames列表

时间:2015-10-16 17:32:27

标签: python list pandas list-comprehension

我有一个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循环将是一个选项(但次优)。是否有可能使用列表理解来实现这一点并且是最有效的解决方案?

1 个答案:

答案 0 :(得分:1)

使用zip()函数,例如 -

,这是一个简单的for循环
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