Groupby, карта и сумма в Pandas, в результате чего NaN - PullRequest
0 голосов
/ 26 апреля 2018

данных Несколько строк на один идентификатор

ID Value1 Value2
1    1     0
1    0     1
1    3     1

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

Для каждого идентификатора (SUM (Значение1)) * (Значение2).

В этом случае для ID1 будет 4 * 0 = 0.

Я хочу вернуть результат в исходную таблицу, как показано ниже

ID Value1 Value2 Calculated_Value
1    1     0        0
1    0     1        4
1    3     1        4

Я пытался это .. он запустился, но я получил NaN в выходной таблице ..

df['Calculated_Value'] = df['ID'].map(df.groupby('ID')['Value1'].sum()*['Value2'])

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

С pd.factorize и np.bincount

f, u = pd.factorize(df.ID)
df.assign(YourValue=np.bincount(f, df.Value1)[f] * df.Value2)

   ID  Value1  Value2  YourValue
0   1       1       0        0.0
1   1       0       1        4.0
2   1       3       1        4.0

Супер схематичное использование fillna для автоматического определения, следует ли мне понижать до int

f, u = pd.factorize(df.ID)
df.assign(YourValue=np.bincount(f, df.Value1)[f] * df.Value2).fillna(
    0, downcast='infer')

   ID  Value1  Value2  YourValue
0   1       1       0          0
1   1       0       1          4
2   1       3       1          4
0 голосов
/ 26 апреля 2018

Мы можем использовать groupby и mul

df['Yourvalue']=df.set_index('ID').Value2.mul(df.groupby('ID').Value1.sum(),level=0).values
df
Out[278]: 
   ID  Value1  Value2  Yourvalue
0   1       1       0          0
1   1       0       1          4
2   1       3       1          4
0 голосов
/ 26 апреля 2018

Вы можете сделать это с помощью .transform:

df['Calculated_Value'] = df.groupby('ID').Value2. \
                            transform(lambda x: x * df['Value1'].sum())

print df

#    ID  Value1  Value2  Calculated_Value
# 0   1       1       0                 0
# 1   1       0       1                 4
# 2   1       3       1                 4
0 голосов
/ 26 апреля 2018

Вы можете использовать groupby.transform для этого:

df['Calculated_Value'] = df.groupby('ID')['Value1'].transform('sum') * df['Value2']

print(df)

   ID  Value1  Value2  Calculated_Value
0   1       1       0                 0
1   1       0       1                 4
2   1       3       1                 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...