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

Posted

技术标签:

【中文标题】Python - 用于将值从列表分配到 DataFrame 列表的列表理解表达式【英文标题】:Python - List comprehension expression for assigning values from list to list of DataFrames 【发布时间】:2016-01-15 13:12:54 【问题描述】:

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

【问题讨论】:

列表推导是一种函数式编程工具,不要使用它们来故意制造副作用。什么是 for 循环的“次优”,它可以避免毫无意义地创建一个可能只是填充了 None 的列表,只是为了立即收集它? 【参考方案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

【讨论】:

好吧,我也添加了。

以上是关于Python - 用于将值从列表分配到 DataFrame 列表的列表理解表达式的主要内容,如果未能解决你的问题,请参考以下文章

Android - 将值从 sqlite 数据库加载到数组列表

如何将值从动态列表视图传递到活动?

PySimpleGui:如何将值从一个列表框添加到另一个列表框

如何将值从列表视图传递到 detalis Activity

使用列表将值从一个类传输到另一个类

将值从第一个下拉列表提交到第二个下拉列表而不重新加载页面