循环创建数据框

时间:2019-03-21 09:47:02

标签: python pandas

我想在一个循环中创建一个数据框,然后在循环中使用这些数据框。我尝试了eval()函数,但是没有用。

例如:

for i in range(5):
    df_i = df[(df.age == i)]

我想创建df_0df_1等。然后在进行一些计算后将这些新的数据帧连接起来:

final_df = pd.concat(df_0,df_1)

for i in range(2:5):
    final_df = pd.concat(final_df, df_i)

2 个答案:

答案 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