[英]Create Dataframe with rows made for each string appearing in a column of another Dataframe
[英]Create rows of a column in a dataframe as a column in another dataframe
我有兩個熊貓數據框:
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
我如何實現這一目標? 我在 Dataframe 1 中有 50K 行,在 Dataframe 2 中有大約 10K 行。其次,是否有一種 pythonic 方法來代替循環?
========
玩完之后,我能夠使用 for 循環解決這個問題。 然而,從性能的角度來看,它是非常低效的。 有人可以幫我知道如何用pythonic方式替換解決方案中的for循環嗎?
無效的解決方法:
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
輸出:
這是指向具有多種解決方案的另一個線程的鏈接。
這是基於該線程的解決方案(不確定您的解決方案中的 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.