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

标签 python list pandas list-comprehension

我有一个 DataFrame 列表(我读入的每个文件一个)和一个字符串列表(文件的文件名)。我想在每个 DataFrame 中创建一个新列 filename 并为其分配文件名列表中的相应值。目标是在连接 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 循环将是一个选项(但不是最优的)。是否可以使用列表理解来实现这一点,这是最有效的解决方案吗?

最佳答案

执行此操作的正确方法是使用 zip() 的简单 for 循环函数,示例 -

for df_,file in zip(list_df,file_names):
    df_.loc[:,'filename'] = file

但是如果你真的必须使用列表推导式,你就不能在列表推导式中使用赋值语句。取而代之的是,您可以尝试创建一个执行赋值的函数,并使用列表推导式调用该函数。

您还需要 zip() dataframes 列表和 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

关于Python - 用于将值从列表分配到 DataFrame 列表的列表理解表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33176307/

相关文章:

python - 修复多列条件的值

python - 每个键有多个值的列表到字典转换?

python - 如何处理 python 中不同类型的编码?

java - 如何重新设计方法以使其发挥作用

python - 从字符串数据 pandas 中提取关键字

python - 比较两个 Pandas 系列中的字符串条目

python - 如何更新 matplotlib hexbin 图?

python - 在 python 中实现服务提供者接口(interface)模式

Python根据值从字典列表中删除重复项

python - 如何在 Python 中获取列表并填充值并放入数据框和过滤器中?