【问题标题】:creating multiple dataframes from looping over a column in a df通过在 df 中的列上循环创建多个数据框
【发布时间】:2022-01-11 18:08:02
【问题描述】:

我希望从一个原始数据帧创建多个数据帧。我想遍历一列并在其匹配项上创建数据框。

   TargetListID Placement_Description Buy_Component_Type  NPI_ID First_Name
0        123456             test_test              email  123456       paul
1        234567             test_test              email  123456       paul
2        345678             test_test              email  123456       paul
3        456789             test_test              email  123456       paul
4        123456        test_test_test              video  987654      karol
5        234567        test_test_test              video  987654      karol
6        345678        test_test_test              video  987654      karol
7        456789        test_test_test              video  987654      karol

这是我原来的 df,我想为我浏览过的TargetListID 中的每场比赛创建一个新的 df:

Create multiple dataframes in loop

并尝试了以下方法:

def create_df_from_target_list_id(dataframe):
    dataframe = {target_list_id: pd.DataFrame() for target_list_id in dataframe['TargetListID']}
    return dataframe


test = create_df_from_target_list_id(df)
print(test)

这给了我:

{123456: Empty DataFrame
Columns: []
Index: [], 234567: Empty DataFrame
Columns: []
Index: [], 345678: Empty DataFrame
Columns: []
Index: [], 456789: Empty DataFrame
Columns: []
Index: []}

所以不确定我在这里到底做错了什么?将创建任何指针。原因是原始数据框可能有 1000 行。所以想在不知道TargetListId的情况下创建数据框@

我在这里尝试了 groupby:

def create_df_from_target_list_id(dataframe):
    dataframe = dict(iter(dataframe.groupby('TargetListID')))
    return dataframe


test = create_df_from_target_list_id(df)
print(test)

得到以下结果

{123456:    TargetListID Placement_Description Buy_Component_Type  NPI_ID First_Name
0        123456             test_test              email  123456       paul
4        123456        test_test_test              video  987654      karol, 234567:    TargetListID Placement_Description Buy_Component_Type  NPI_ID First_Name
1        234567             test_test              email  123456       paul
5        234567        test_test_test              video  987654      karol, 345678:    TargetListID Placement_Description Buy_Component_Type  NPI_ID First_Name
2        345678             test_test              email  123456       paul
6        345678        test_test_test              video  987654      karol, 456789:    TargetListID Placement_Description Buy_Component_Type  NPI_ID First_Name
3        456789             test_test              email  123456       paul
7        456789        test_test_test              video  987654      karol}

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    看起来您的方法并不遥远,但请注意,在您的函数中,您正在调用 pd.DataFrame(),它创建了一个 DataFrame,但没有给它提供任何数据来使用(因此是空的 DataFrames)。

    如果您希望 TargetListID 的每个唯一值都有一个 DataFrame,并且您的原始 DataFrame 称为 df,那么您可以执行以下操作:

    df_dictionary = { target_id: df[ df.TargetListID == target_id ] for target_id in df.TargetListID.unique() }
    

    您可以在函数内部或单独执行此操作。

    请注意,您可能希望首先删除任何空的 TargetListID 值,并且您可能希望在创建字典时使用 reset_index(),具体取决于您的需要。

    【讨论】:

    • 这有点用,我有一个 df 和一组不同的情况。我希望能够使用 4 个不同的数据框
    • 这将为每个唯一的 TargetListID 值创建一个带有键的字典,以及一个由原始 DataFrame 中与该 TargetListID 值匹配的行组成的 DataFrame。如果您有 4 个唯一的 TargetListID 值,您将有一个包含四个(键、值)对的字典,即 4 个 DataFrame。
    • 但是有了字典,我不需要知道第一个键才能访问它吗?我想要一些我有一个分组的 df 的东西,然后我可以将一些地方发送到 API。我不会总是知道钥匙
    • 您始终可以使用df_dictionary.keys() 访问密钥。如果您不想使用字典,也可以使用 df_list = [ df[ df.TargetListID == target_id ] for target_id in df.TargetListID.unique() ] 将 DataFrame 存储在列表中。
    【解决方案2】:

    我认为您正在寻找一个简单明了的groupby

    r = {}
    for target_id, df in in dataframe.groupby('TargetListID'):
        r[target_id] = df
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 2019-04-28
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多