gpt4 book ai didi

python - 更改 pandas DataFrame 中每个组的第一个元素

转载 作者:行者123 更新时间:2023-12-02 04:29:08 25 4
gpt4 key购买 nike

我要确保每个vintage对应的val2的第一个值为NaN。目前两个已经是NaN,但我想确保0.53也变成NaN

df = pd.DataFrame({
'vintage': ['2017-01-01', '2017-01-01', '2017-01-01', '2017-02-01', '2017-02-01', '2017-03-01'],
'date': ['2017-01-01', '2017-02-01', '2017-03-01', '2017-02-01', '2017-03-01', '2017-03-01'],
'val1': [0.59, 0.68, 0.8, 0.54, 0.61, 0.6],
'val2': [np.nan, 0.66, 0.81, 0.53, 0.62, np.nan]
})

这是我到目前为止尝试过的:

df.groupby('vintage').first().val2 #This gives the first non-NaN values, as shown below

vintage
2017-01-01 0.66
2017-02-01 0.53
2017-03-01 NaN

df.groupby('vintage').first().val2 = np.nan #This doesn't change anything
df.val2

0 NaN
1 0.66
2 0.81
3 0.53
4 0.62
5 NaN

最佳答案

你不能给聚合结果赋值,first 也会忽略现有的NaN,你可以做的是调用head(1) 将返回每个组的第一行,并将索引传递给 loc 以屏蔽 orig df 以覆盖这些列值:

In[91]
df.loc[df.groupby('vintage')['val2'].head(1).index, 'val2'] = np.NaN
df:

Out[91]:
date val1 val2 vintage
0 2017-01-01 0.59 NaN 2017-01-01
1 2017-02-01 0.68 0.66 2017-01-01
2 2017-03-01 0.80 0.81 2017-01-01
3 2017-02-01 0.54 NaN 2017-02-01
4 2017-03-01 0.61 0.62 2017-02-01
5 2017-03-01 0.60 NaN 2017-03-01

在这里您可以看到 head(1) 返回每个组的第一行:

In[94]:
df.groupby('vintage')['val2'].head(1)
Out[94]:
0 NaN
3 0.53
5 NaN
Name: val2, dtype: float64

first 对比,它将返回第一个非 NaN 值,除非该组只有 NaN 值:

In[95]:
df.groupby('vintage')['val2'].first()

Out[95]:
vintage
2017-01-01 0.66
2017-02-01 0.53
2017-03-01 NaN
Name: val2, dtype: float64

关于python - 更改 pandas DataFrame 中每个组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50693031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com