我的数据框是:
import pandas as pd
df = pd.DataFrame(
{
'a': [20, 9, 31, 40],
'b': [1, 10, 17, 30],
}
)
预期输出:创建列
c
a b c
0 20 1 20
1 9 10 20
2 31 17 17
3 40 30 31
步骤:
c
是 df.b
和 df.a.shift(1).bfill()
之间的最大值。
我的尝试:
df['temp'] = df.a.shift(1).bfill()
df['c'] = df[['temp', 'b']].max(axis=1)
这是最干净的方式/最好的方法吗?
尝试这样
import pandas as pd
df = pd.DataFrame(
{
'a': [20, 9, 31, 40],
'b': [1, 10, 17, 30],
}
)
df['c'] = df['a'].shift(1).bfill().combine(df['b'], max)
print(df)
输出:
a b c
0 20 1 20.0
1 9 10 20.0
2 31 17 17.0
3 40 30 31.0
如果您不需要临时列,则可以在单行代码中使用
where()
替换移位列上的值。
df['c'] = df['a'].shift(1).bfill().where(lambda x: x>df['b'], df['b'])
这与另一个答案中发布的
combine()
方法类似,但是这个方法进行矢量化比较,而 combine()
则按元素进行比较,因此随着数据帧长度的增加,这应该会更快。
导入错误:tidak dapat mengimpor nama 'DataError' dari 'pandas.core.base' (/Users/ernidiahsusanti/anaconda3/lib/python3.11/site-packages/pandas/core/base.py)