Возврат значений в новые столбцы в pandas df - PullRequest
0 голосов
/ 24 мая 2018

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

На данный момент у меня есть код, который возвращает значения в новые столбцы всякий раз, когда совершается продажа.Поэтому, если тема появляется в столбце Sales, соответствующие значения индексируются в новых столбцах.

import pandas as pd
import numpy as np

a = 5
N = 10

df = pd.DataFrame({
    'Tom_$' : [500, 50, 10, 60, 50, 77, 30, 600, 40, 60],
    'Tom_c' : [100, 20, 40, 50, 0, 67, 90, 100, 0, 0],
    'Code' : ['nan', 'nan', 'Big', 'nan', 'nan', 'Small', 'nan','nan', 'nan','nan'],                                 
    'Sales' : ['nan','nan','Tom','nan','nan','Tom','nan','nan','nan','nan']})


df['Big'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1)
df['Small'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1)

Вывод:

    Code  Julie_$  Julie_c  Sales  Tom_$  Tom_c  Dollars  Cents
0    nan      500      300    nan    500    100      NaN    NaN
1    nan       40       20    nan     50     20      NaN    NaN
2    Big       10       70    Tom     10     40     10.0   40.0
3    nan       10       50    nan     60     50      NaN    NaN
4    nan       50       80    nan     50      0      NaN    NaN
5  Small       37       67    Tom     77     67     77.0   67.0
6    nan       30       50    nan     30     90      NaN    NaN
7    Big      900      100  Julie    600    100    900.0  100.0
8    nan       40       40    nan     40      0      NaN    NaN
9    nan       50        0    nan     60      0      NaN    NaN

Это отлично работает, но я хочу добавить еще один слой, используя столбец Code.Если значение в этом столбце равно Big, я хочу продолжать возвращать значения продавца до новой продажи.Если это Small Мне все равно.

Таким образом, результат будет:

    Code  Julie_$  Julie_c  Sales  Tom_$  Tom_c  Dollars  Cents
0    nan      500      300    nan    500    100      NaN    NaN
1    nan       40       20    nan     50     20      NaN    NaN
2    Big       10       70    Tom     10     40     10.0   40.0
3    nan       10       50    nan     60     50     60.0   50.0
4    nan       50       80    nan     50      0     50.0    0.0
5  Small       37       67    Tom     77     67     77.0   67.0
6    nan       30       50    nan     30     90      NaN    NaN
7    Big      900      100  Julie    600    100    900.0  100.0
8    nan       40       40    nan     40      0     40.0    0.0
9    nan       50        0    nan     60      0     60.0    0.0

Я рассмотрел использование аналогичного метода для возврата значений, таких как Sales столбец

df['Dollars'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1)
df['Cents'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1)

Но это толькоработает, когда значение совпадает с индексом.Я немного запутался.Я не уверен, должен ли я заполнить данные, чтобы в столбце Code всегда были значения.

      Code
0      nan
1      nan
2      Big
3      Big
4      Big
5    Small
6    Small
7      Big
8      Big
9      Big

Затем я могу выбрать важные из них.Но я не хочу менять исходный набор данных.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать значения замены NaN s в столбце Sales на ffill для прямого заполнения по маске при прямом заполнении Code is Big или Small:

#replace strings nan to np.nan first
df[['Code', 'Sales']] = df[['Code', 'Sales']].replace('nan',np.nan)

mask = (df['Code'].ffill() == 'Big') | (df['Code'] == 'Small')
df.loc[mask, 'Sales'] = df['Sales'].ffill()

df['Dollars'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1)
df['Cents'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1)
print (df)
    Code  Julie_$  Julie_c  Sales  Tom_$  Tom_c  Dollars  Cents
0    NaN      500      300    NaN    500    100      NaN    NaN
1    NaN       40       20    NaN     50     20      NaN    NaN
2    Big       10       70    Tom     10     40     10.0   40.0
3    NaN       10       50    Tom     60     50     60.0   50.0
4    NaN       50       80    Tom     50      0     50.0    0.0
5  Small       37       67    Tom     77     67     77.0   67.0
6    NaN       30       50    NaN     30     90      NaN    NaN
7    Big      900      100  Julie    600    100    900.0  100.0
8    NaN       40       40  Julie     40      0     40.0   40.0
9    NaN       50        0  Julie     60      0     50.0    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...