你的代码示例让我有点困惑,但重点是
我想对所有数据框进行相同的更改。
和
一般来说,我如何使用迭代器访问 df_1?
您可以通过在字典 (dict) 中组织数据帧 (dfs) 来做到这一点。
方法如下:
假设你的命名空间中有一堆变量......
# Imports
import pandas as pd
import numpy as np
# A few dataframes with random numbers
# df_1
np.random.seed(123)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, 2)), columns=['a', 'b'])
df_1 = df_1.set_index(rng)
# df_2
np.random.seed(456)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_2 = pd.DataFrame(np.random.randint(100,150,size=(rows, 2)), columns=['c', 'd'])
df_2 = df_2.set_index(rng)
# df_3
np.random.seed(789)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_3 = pd.DataFrame(np.random.randint(100,150,size=(rows, 2)), columns=['e', 'f'])
df_3 = df_3.set_index(rng)
...您可以使用以下方法识别所有数据框:
alldfs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)]
如果您有很多不同的数据帧,但只想关注那些前缀为“df_”的数据帧,您可以通过...来识别它们
dfNames = []
for elem in alldfs:
if str(elem)[:3] == 'df_':
dfNames.append(elem)
...然后使用以下命令将它们组织在一个字典中:
myFrames = {}
for dfName in dfNames:
myFrames[dfName] = eval(dfName)
从有趣的数据框列表中,您可以对那些您想使用的数据框进行子集化。以下是您只关注 df_1 和 df_2 的方法:
invalid = ['df_3']
for inv in invalid:
myFrames.pop(inv, None)
现在您可以通过循环引用所有有效的 dfs:
for key in myFrames.keys():
print(myFrames[key])
这应该涵盖...
一般来说,我如何使用迭代器访问 df_1?
...问题的一部分。
您当然可以通过字典中的名称/键来引用单个数据框:
print(myFrames['df_1'])
从这里您可以对所有数据框中的所有列进行操作。
for key in myFrames.keys():
myFrames[key] = myFrames[key]*10
print(myFrames[key])
或者,更 Python 一点,您可以指定一个 lambda 函数并将其应用于列的子集
# A function
decimator = lambda x: x/10
# A subset of columns:
myCols = ['SPEED1', 'SPEED2']
将该函数应用于您感兴趣的数据框中的列子集:
for key in myFrames.keys():
for col in list(myFrames[key]):
if col in myCols:
myFrames[key][col] = myFrames[key][col].apply(decimator)
print(myFrames[key][col])
那么,回到你的功能...
修改(df_1,1)
...这是我对它的看法,它包含在一个函数中。
首先我们将重新定义数据框和函数。
哦,使用此设置,您将必须使用alldfs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)] 获取函数之外的所有 dfs。
这是用于轻松复制粘贴的数据集和函数:
# Imports
import pandas as pd
import numpy as np
# A few dataframes with random numbers
# df_1
np.random.seed(123)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_1 = pd.DataFrame(np.random.randint(100,150,size=(rows, 3)), columns=['SPEED1', 'SPEED2', 'SPEED3'])
df_1 = df_1.set_index(rng)
# df_2
np.random.seed(456)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_2 = pd.DataFrame(np.random.randint(100,150,size=(rows, 3)), columns=['SPEED1', 'SPEED2', 'SPEED3'])
df_2 = df_2.set_index(rng)
# df_3
np.random.seed(789)
rows = 12
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_3 = pd.DataFrame(np.random.randint(100,150,size=(rows, 3)), columns=['SPEED1', 'SPEED2', 'SPEED3'])
df_3 = df_3.set_index(rng)
# A function that divides columns by 10
decimator = lambda x: x/10
# A reference to all available dataframes
alldfs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)]
# A function as per your request
def modify(dfs, cols, fx):
""" Define a subset of available dataframes and list of interesting columns, and
apply a function on those columns.
"""
# Subset all dataframes with names that start with df_
dfNames = []
for elem in alldfs:
if str(elem)[:3] == 'df_':
dfNames.append(elem)
# Organize those dfs in a dict if they match the dataframe names of interest
myFrames = {}
for dfName in dfNames:
if dfName in dfs:
myFrames[dfName] = eval(dfName)
print(myFrames)
# Apply fx to the cols of your dfs subset
for key in myFrames.keys():
for col in list(myFrames[key]):
if col in cols:
myFrames[key][col] = myFrames[key][col].apply(decimator)
# A testrun. Results in screenshots below
modify(dfs = ['df_1', 'df_2'], cols = ['SPEED1', 'SPEED2'], fx = decimator)
以下是操作前的数据帧 df_1 和 df_2:
以下是操作后的数据框:
无论如何,这就是我的处理方式。
希望你会发现它有用!