pandas 如何根据其他列的相同子字符串为行设置新值?

z4bn682m  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(110)

这是一个更大数据的例子。假设我有一个这样的 Dataframe :

df = pd.DataFrame({"CLASS":["AG_1","AG_2","AG_3","MAR","GOM"],
                   "TOP":[200, np.nan, np.nan, 600, np.nan],
                   "BOT":[230, 250, 380, np.nan, 640]})

df
Out[49]: 
  CLASS    TOP    BOT
0  AG_1  200.0  230.0
1  AG_2    NaN  250.0
2  AG_3    NaN  380.0
3   MAR  600.0    NaN
4   GOM    NaN  640.0

我想在第1行和第2行设置TOP的值。我的条件是,如果类以相同的子字符串"AG"开头,则这些值必须是上一行的BOT值。输出应如下所示:

CLASS    TOP    BOT
0  AG_1  200.0  230.0
1  AG_2  230.0  250.0
2  AG_3  250.0  380.0
3   MAR  600.0    NaN
4   GOM    NaN  640.0

有人能教我怎么做吗?

mzsu5hc0

mzsu5hc01#

一般情况:填充所有组

我将使用fillnagroupby.shift,使用自定义组从带有str.extract的CLASS中提取子字符串:

group = df['CLASS'].str.extract('([^_]+)', expand=False)
df['TOP'] = df['TOP'].fillna(df.groupby(group)['BOT'].shift())

输出量:

CLASS    TOP    BOT
0  AG_1  200.0  230.0
1  AG_2  230.0  250.0
2  AG_3  250.0  380.0
3   MAR  600.0    NaN
4   GOM    NaN  640.0

中间体group

0     AG
1     AG
2     AG
3    MAR
4    GOM
Name: CLASS, dtype: object
特殊情况:仅AG组
m = df['CLASS'].str.startswith('AG')

df.loc[m, 'TOP'] = df.loc[m, 'TOP'].fillna(df.loc[m, 'BOT'].shift())

示例:

CLASS    TOP    BOT
0   AG_1  200.0  230.0
1   AG_2  230.0  250.0
2   AG_3  250.0  380.0
3  MAR_1  600.0  601.0
4  MAR_2    NaN    NaN # this is not filled
5    GOM    NaN  640.0

相关问题