Создать строки столбца в кадре данных как столбец в другом кадре данных - PullRequest
0 голосов
/ 31 января 2020

У меня есть два pandas фрейма данных:

Dataframe 1: 
Id                                    TOTAL_CLAIM_COST
023248db-5e9c-42f3-a9fd-4133bee82844    129.16
b851d7d4-813a-4be2-97b6-f16a347628c6    50.00

Dataframe 2: 
Id                                     CODE
023248db-5e9c-42f3-a9fd-4133bee82844    3
023248db-5e9c-42f3-a9fd-4133bee82844    1
023248db-5e9c-42f3-a9fd-4133bee82844    2

Желаемый вывод:

Dataframe 3: 
Id                                    TOTAL_CLAIM_COST CODE_1  CODE_2  CODE_3
023248db-5e9c-42f3-a9fd-4133bee82844    129.16          3        1       2
b851d7d4-813a-4be2-97b6-f16a347628c6     50.0           NaN      NaN     Nan

Как мне этого добиться? У меня есть 50K строк в Dataframe 1 и около 10K строк в Dataframe 2. Во-вторых, есть ли способ pythoni c сделать это вместо циклов?

========

После игры я смог решить эту проблему, используя l oop. Однако это очень неэффективно с точки зрения производительности. Может кто-нибудь помочь мне узнать, как заменить циклы for в решении на pythoni c way?

Неэффективное решение:

import pandas as pd

data1 = [{'Id': '023248db-5e9c-42f3-a9fd-4133bee82844', 'TOTAL_CLAIM_COST':129.16}, {'Id': 'b851d7d4-813a-4be2-97b6-f16a347628c6', 'TOTAL_CLAIM_COST':50.00}]
df1 = pd.DataFrame(data1)

data2 = [{'Id': '023248db-5e9c-42f3-a9fd-4133bee82844', 'CODE':3}, {'Id': '023248db-5e9c-42f3-a9fd-4133bee82844', 'CODE':1},{'Id': '023248db-5e9c-42f3-a9fd-4133bee82844', 'CODE':2},{'Id': '02eb040d-a1be-4f00-b6cc-eeda3e0b939f', 'CODE':8},{'Id': '02eb040d-a1be-4f00-b6cc-eeda3e0b939f', 'CODE':9}]
df2 = pd.DataFrame(data2)

df2['COUNT'] = df2.groupby('Id')['Id'].transform('count')
num = df2['COUNT'].max()

for i in range(num):
    col_name = 'CODE' + '_' + str(i)
    df3[col_name] = 0

counter = 0
for index, row in df3.iterrows():

    counter = 0

    df4 = df2[df2['Id'] == row['Id']]

    for index2, row2 in df4.iterrows():
        if counter < num:
            col_name = '''''' + 'CODE' + '_' + str(counter) + ''''''
            df3.at[index,col_name] = row2['CODE']
            counter += 1

Вывод:

sample output

1 Ответ

0 голосов
/ 31 января 2020

Вот ссылка на другой поток, который имеет несколько решений.

Pandas - Преобразование столбцов в новые строки после groupby

Вот решение, основанное на этот поток (не уверен, где вы получили 70 в вашем решении).

df=pd.pivot_table(df2,index=['Id'],columns=df2.groupby(['Id']).cumcount().add(1),values=['CODE']).fillna(0)
df.columns=df.columns.map('{0[0]}_{0[1]}'.format) 
final_df = pd.concat([df,df1.set_index('Id')],axis=1).fillna(0).reset_index().rename(columns={'index':"Id"})
print(final_df)

                                        Id  CODE_1  CODE_2  CODE_3  TOTAL_CLAIM_COST
0  023248db-5e9c-42f3-a9fd-4133bee82844    3.0    1.0    2.0            129.16
1  02eb040d-a1be-4f00-b6cc-eeda3e0b939f    8.0    9.0    0.0              0.00
2  b851d7d4-813a-4be2-97b6-f16a347628c6    0.0    0.0    0.0             50.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...