熊猫根据以下列的值移动列

时间:2020-07-14 16:27:29

标签: python pandas

使用以下数据框,当下面的列价格为na (或为空)时,我仅尝试将Price列下移一个

初始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)

熊猫移动列基于下面的列的值

2 个答案:

答案 0 :(得分:0)

您可以分两步进行

首先让我们写一个布尔值来测量空值。

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

一口气。

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

答案 1 :(得分:0)

您可以尝试以下方法:

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'