【问题标题】:Concatenate pandas DataFrames generated with a loop连接使用循环生成的 pandas DataFrame
【发布时间】:2018-07-26 09:58:30
【问题描述】:

我正在创建一个名为 data_day 的新 DataFrame,其中包含新功能,用于从前一个 DataFrame df 的日期时间戳推断的每一天。

我的新数据帧 data_day 是 30 个独立的数据帧,我需要将它们连接/附加到一个统一数据帧 (final_data_day) 的末尾。

每天的for循环定义如下:

num_days=len(list_day)

#list_day= random.sample(list_day,num_days_to_simulate)
data_frame = pd.DataFrame()

for i, day in enumerate(list_day):

    print('*** ',day,' ***')

    data_day=df[df.day==day]
    .....................
    final_data_day = pd.concat()

希望我很清楚。我的问题基本上是在非平凡的 for 循环中生成的数据帧的附加/连接问题

【问题讨论】:

  • 这个不清楚。既然你不知道怎么做,那么如果没有你给我们举个例子,你怎么能指望我们知道你在做什么呢?我的建议是阅读minimal reproducible example,然后相应地编辑您的问题。您将大大增加获得高质量答案的几率。
  • 对不起!我正在看最小的,完整的..当这些家伙已经解决了。我是这个平台上提问的新手。以后会考虑的。

标签: python pandas loops dataframe append


【解决方案1】:

Pandas concat 获取数据帧列表。如果您可以使用循环函数生成数据帧列表,则完成后您可以将列表连接在一起:

data_day_list = []
for i, day in enumerate(list_day):
    data_day = df[df.day==day]
    data_day_list.append(data_day)
final_data_day = pd.concat(data_day_list)

【讨论】:

  • 可爱! @drinck 的解决方案效果惊人。非常感谢
  • 我以前也做过“data_day = df[df.day==day]”,但发现这明显更快:groups = df.groupby("day") 然后做data_day = groups.get_group("day")
【解决方案2】:

耗尽生成器比附加到列表更优雅(如果不是更有效)。例如:

def yielder(df, list_day):
    for i, day in enumerate(list_day):
        yield df[df['day'] == day]

final_data_day = pd.concat(list(yielder(df, list_day))

【讨论】:

    【解决方案3】:

    追加或连接pd.DataFrames 很慢。您可以在中间使用一个列表,然后在末尾创建最终的pd.DataFrame,并使用pd.DataFrame.from_records(),例如:

    interim_list = []
    for i,(k,g) in enumerate(df.groupby(['[*name of your date column here*'])):
        if i % 1000 == 0 and i != 0:
            print('iteration: {}'.format(i)) # just tells you where you are in iteration
        # add your "new features" here...
        for v in g.values:
            interim_list.append(v)
    
    # here you want to specify the resulting df's column list...
    df_final = pd.DataFrame.from_records(interim_list,columns=['a','list','of','columns'])
    

    【讨论】:

    • 你写得很完整。谢谢! ...不能在 Stackoverflow 上投两票??
    猜你喜欢
    • 2020-01-07
    • 2021-02-17
    • 1970-01-01
    • 2021-04-04
    • 2021-12-13
    • 2020-08-14
    • 1970-01-01
    • 2021-12-28
    • 2021-10-02
    相关资源
    最近更新 更多