Я хочу заполнить значение в Dataframe на основе сопоставления значений в другом Dataframe - PullRequest
0 голосов
/ 01 июля 2018

Я редактирую вопрос. Я не хочу использовать groupby для использования групповых значений. Я был бы признателен, если бы кто-то мог помочь только с запросом для преобразования данных следующим образом:

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

df1:

col1    col2
------------
VG       12
G        11
A        10
P        06
VP       0

Я хочу новый фрейм данных, такой как:

df2:

VG    G   A   P   VP
---------------------
12    11  10   06  0     

Я попытался добиться этого, используя условие if, и получил следующую ошибку: Код:

 if df1.Score=='VG':
    df2['VG']=df1.loc[df1['col1'] == 'VG', 'col2']

 The truth value of a Series is ambiguous. Use a.empty, a.bool(), 
 a.item(), a.any() or a.all() 

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Вот долгий путь, если ничего не помогает:

s = [pd.Series(g.loc[g['col2'] != 0, 'col2'].values, name=k) \
     for k, g in df.groupby('col1')]

res = pd.concat(s, axis=1, ignore_index=False).fillna(0)

print(res)

    A     G    P  VG   VP
0  10  11.0  6.0  12  0.0
1  50   0.0  0.0  53  0.0
0 голосов
/ 01 июля 2018

Спасибо @ user2285236 за улучшенный ответ:

s = df1.groupby('col1').cumcount()

df = (df1.set_index(['col1', s])['col2']
         .unstack(level=0, fill_value=0)
         .rename_axis(None, 1))
print (df)
    A   G  P  VG  VP
0  10  11  6  12   0
1  50   0  0  53   0

Пояснение:

  1. Создать MultiIndex на set_index по первому столбцу с Series, созданным GroupBy.cumcount для значений счетчиков на группы для нового индекса
  2. Изменить на unstack
  3. Очистка данных по rename_axis
0 голосов
/ 01 июля 2018

agg и transform будут работать :)

df.groupby('col1').agg(list).col2.transform(pd.Series).T.fillna(0)

    A   G   P       VG          VP
0   10.0    11.0    6.0 12.0    0.0
1   50.0    0.0     0.0 53.0    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...