Solution
Inputs
import pandas as pd
import numpy as np
df_1 = pd.DataFrame({'SPEED1':np.random.uniform(1,600,100))
df_2 = pd.DataFrame({'SPEED2':np.random.uniform(1,600,100))
Code
在我看来,更好的方法是存储您的dfs
到一个列表中并枚举它以将信息添加到您的dfs
创建一个valid
column:
for idx, df in enumerate([df_1, df_2]):
col = 'SPEED'+str(idx+1)
df['valid'] = df[col] <= 500
print(df_1)
SPEED valid
0 516.395756 False
1 14.643694 True
2 478.085372 True
3 592.831029 False
4 1.431332 True
然后,您可以使用以下命令过滤有效或无效的内容df_1[df_1.valid]
or df_1[df_1.valid == False]
这是适合您问题的解决方案,请参阅另一种解决方案这可能会更干净Notes以下为您需要的解释。
另一个(更好?)的解决方案
如果您可以重新考虑您的代码。每个DataFrame都有一列速度,然后命名SPEED
:
dfs = dict(df_1=pd.DataFrame({'SPEED':np.random.uniform(0,600,100)}),
df_2=pd.DataFrame({'SPEED':np.random.uniform(0,600,100)}))
它将允许您执行以下操作:
dfs = dict(map(lambda key_val: (key_val[0],
key_val[1].assign(valid = key_val[1]['SPEED'] <= 500)),
dfs.items()))
print(dfs['df_1'])
SPEED valid
0 516.395756 False
1 14.643694 True
2 478.085372 True
3 592.831029 False
4 1.431332 True
说明:
-
dfs.items()
返回键(即名称)和值(即数据帧)的列表
-
map(foo, bar)
应用函数 foo (参见这个答案, and 数据帧分配)到 bar 的所有元素(即到dfs.items()
.
-
dict()
将地图转换为字典。
Notes
About modify
请注意你的函数modify
不返回任何内容...我建议您阅读更多关于 Python 中的可变性和不可变性的内容。这article很有趣。
然后您可以测试以下内容:
def modify(df):
df=df[df.SPEED1<0.5]
#The change in df is on the scope of the function only,
#it will not modify your input, return the df...
return df
#... and affect the output to apply changes
df_1 = modify(df_1)
关于访问df_1
使用迭代器
请注意,当您这样做时:
for i in range(1,n+1):
df_i something
df_i
在你的循环中将调用该对象df_i
对于每次迭代(而不是df_1
ETC。)
要通过名称调用对象,请使用globals()['df_'+str(i)]
相反(假设df_1
to df_n+1
位于globals()
) - 由此answer.
在我看来,这不是一个干净的方法。我不知道你如何创建你的 DataFrame,但如果你可能的话,我会建议你将它们存储到字典中,而不是手动影响:
dfs = {}
dfs['df_1'] = ...
或者更自动一些,如果df_1
to df_n
已经存在 - 根据第一部分维斯特兰答案 :
dfs = dict((var, eval(var)) for
var in dir() if
isinstance(eval(var), pd.core.frame.DataFrame) and 'df_' in var)
那么你就可以更轻松地迭代 DataFrames:
for i in range(1,n+1):
dfs['df_'+str(i)'] something