我想在一个循环中创建一个数据框,然后在循环中使用这些数据框。我尝试了eval()函数,但是没有用。
例如:
for i in range(5):
df_i = df[(df.age == i)]
我想创建df_0
,df_1
等。然后在进行一些计算后将这些新的数据帧连接起来:
final_df = pd.concat(df_0,df_1)
for i in range(2:5):
final_df = pd.concat(final_df, df_i)
答案 0 :(得分:0)
您可以创建数据帧x
的字典,并将i
作为字典键:
np.random.seed(42)
df = pd.DataFrame({'age': np.random.randint(0, 5, 20)})
x = {}
for i in range(5):
x[i] = df[df['age']==i]
final = pd.concat(x.values())
然后,您可以将各个DataFrame称为:
x[1]
输出:
age
5 1
13 1
15 1
并将它们全部与:
pd.concat(x.values())
输出:
age
18 0
5 1
13 1
15 1
2 2
6 2
...
答案 1 :(得分:0)
这种方法很奇怪,不建议这样做,但是可以做到。
答案
for i in range(5):
exec("df_{i} = df[df['age']=={i}]")
def UDF(dfi):
# do something in user-defined function
for i in range(5):
exec("df_{i} = UDF(df_{i})")
final_df = pd.concat(df_0,df_1)
for i in range(2:5):
final_df = pd.concat(final_df, df_i)
更好的方式1
使用列表或字典存储数据框应该是一种更好的方法,因为您可以通过索引或键访问每个数据框。
由于另一个答案显示了使用字典(@perl)的方式,因此我将向您展示使用列表的方式。
def UDF(dfi):
# do something in user-defined function
dfs = [df[df['age']==i] for i in range(i)]
final_df = pd.concat(map(UDF, dfs))
更好的方式2
由于您使用的是pandas.DataFrame,因此groupby
函数是执行所需操作的一种“熊猫”方法。 (也许,我想是因为我不知道你想做什么。哈哈)
def UDF(dfi):
# do something in user-defined function
final_df = df.groupby('age').apply(UDF)
参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html