Python - 用于将值从列表分配到 DataFrame 列表的列表理解表达式
Python - List comprehension expression for assigning values from list to list of DataFrames
我有一个 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()
数据框列表和 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
我有一个 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()
数据框列表和 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