Панды: объединить два кадра данных и динамически расширять строки - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующие настройки данных

A

[ClaimantId], [ClaimId], [LenderId], [IsWorked] 1 1 1 1 1 2 4 0 1 3 3 1 2 6 1 1

B

[ClaimantId], [Forename], [Surname]
1             Bruce       Wayne
2             Peter       Parker

Мой желаемый вывод будет

[ClaimantId], [Forename], [Surname], [C1], [C2], [C3], [L1], [L2], [L3], [W1], [W2], [W3]
1             Bruce       Wayne      1      2     3    1     4     3      1    0     1
2             Peter       Parker     6      Nan   Nan  1     Nan   Nan    1    Nan   Nan

Я не уверен, что я могу применить к этому, количество столбцов C / L / W имеет верхний предел 20 и никогда не будет превышен.

Буду очень признателен за любую помощь.

Спасибо,

1 Ответ

0 голосов
/ 26 сентября 2018

Использование:

d = {'ClaimId':'C', 'LenderId':'L','IsWorked':'W'}
df = (A.rename(columns=d)
       .set_index(['ClaimantId',A.groupby('ClaimantId').cumcount()])
       .unstack())
df.columns = [f'{i}{j+1}' for i, j in df.columns]
print (df)
               C1   C2   C3   L1   L2   L3   W1   W2   W3
ClaimantId                                             
1             1.0  2.0  3.0  1.0  4.0  3.0  1.0  0.0  1.0
2             6.0  NaN  NaN  1.0  NaN  NaN  1.0  NaN  NaN

df1 = B.join(df, on='ClaimantId')
print (df1)
    ClaimantId    Forename   Surname   C1   C2   C3   L1   L2   L3   W1   W2  \
0             1      Bruce     Wayne  1.0  2.0  3.0  1.0  4.0  3.0  1.0  0.0   
1             2      Peter    Parker  6.0  NaN  NaN  1.0  NaN  NaN  1.0  NaN   

    W3  
0  1.0  
1  NaN

Объяснение :

  1. Первые rename столбцы по dict
  2. Затем set_index с помощью счетчика Series, созданного cumcount
  3. Изменить на unstack
  4. Свести многоиндексные столбцы на list comprehensionс f-string с
  5. Последний join секунда DataFrame

РЕДАКТИРОВАТЬ:

При необходимости одинаковой длины все столбцы используют reindex новым MultiIndex созданным range:

d = {'ClaimId':'C', 'LenderId':'L','IsWorked':'W'}
df = (A.rename(columns=d)
       .set_index(['ClaimantId',A.groupby('ClaimantId').cumcount()])
       .unstack())

mux = pd.MultiIndex.from_product([df.columns.get_level_values(0).unique(), range(5)])
df = df.reindex(columns=mux, fill_value=0)
df.columns = [f'{i}{j+1}' for i, j in df.columns]
print (df)
             C1   C2   C3  C4  C5   L1   L2   L3  L4  L5   W1   W2   W3  W4  \
ClaimantId                                                                    
1           1.0  2.0  3.0   0   0  1.0  4.0  3.0   0   0  1.0  0.0  1.0   0   
2           6.0  NaN  NaN   0   0  1.0  NaN  NaN   0   0  1.0  NaN  NaN   0   

            W5  
ClaimantId      
1            0  
2            0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...