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

标签 python pandas dataframe

我要确保每个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/46242488/

相关文章:

python - 使用 Pandas 比较字符串到 JSON

python - 将 Pandas 多索引变成列

python - 使用字典值过滤数据帧,同时将字典键分配给匹配的行?

Python Virtualenvwrapper 的 "workon"和 Zsh

Python 无法调用函数

python - df.transform 中的 ValueError(lambda x : 0 if (x == 0) else (-np. log(-x) if x < 0 else np.log(x)))

python-3.x - 使用 Pandas 数据帧时,无法将存储为 excel 中的字符串的矩阵转换为 numpy 数组

python - 在 Python 中将日本时间格式 (H29.12.1) 转换为 YYYY-MM-DD 格式?

python - 在 python 中打印越来越多的列表项

python - 使用 python 守护进程在 OS X 10.7 上获取事件应用程序