Pandas сдвиг столбца на основе значения столбца ниже - PullRequest
1 голос
/ 14 июля 2020

Используя следующий фрейм данных, я пытаюсь сместить столбец Price вниз только на , когда цена столбца ниже na (или пуста).

начальный df

+-----------+-------+
|  Client   | Price |
+-----------+-------+
| Desc of A |    20 |
| Client A  |       |
| Client B  |    30 |
| Desc of C |    10 |
| Client C  |       |
+-----------+-------+

приведет к следующему. Обратите внимание, что 30 не сдвинулся, потому что в столбце price в строке ниже поле не было пустым (было 10)

+-----------+-------+
|  Client   | Price |
+-----------+-------+
| Desc of A |       |
| Client A  |    20 |
| Client B  |    30 |
| Desc of C |       |
| Client C  |    10 |
+-----------+-------+

Пример df:

d = {'Client': ['Desc of A', 'Client A', 'Client B', 'Desc of C', 'Client C',], 'Price': [20,np.nan ,30, 10,np.nan]}
df = pd.DataFrame(data=d)

Pandas сдвиг столбца на основе значения столбца ниже

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Вы можете попробовать это:

df.Price.ffill(inplace=True) # Forward fill to fill the na values.
df = df[~df['Client'].astype(str).str.startswith('Desc')] # remove rows where Client starts with 'Desc'
0 голосов
/ 14 июля 2020

Вы можете сделать это в два этапа,

сначала напишем логическое значение для измерения нулевых значений.

nulls = df['Price'].isna()

Если это условие истинно, возьмите строку выше.

s = df['Price'].isna().shift(-1).fillna(False)

затем присвойте эти значения этой строке (нулевой строке). мы можем использовать .values для назначения в виде списка.

df.loc[nulls,'Price'] = df.loc[s,'Price'].values

затем назначить перемещенные значения как пустые.

df.loc[s,'Price'] = np.nan

в одном go.

nulls = df['Price'].isna()
s = df['Price'].isna().shift(-1).fillna(False)
df.loc[nulls,'Price'] = df.loc[s,'Price'].values
df.loc[s,'Price'] = np.nan

print(df)

      Client  Price
0  Desc of A    NaN
1   Client A   20.0
2   Client B   30.0
3  Desc of C    NaN
4   Client C   10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...