使用以下数据框,当下面的列价格为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)
熊猫移动列基于下面的列的值
答案 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'