python - 当特定列值为空时添加所有列的行值,直到它获得非空值?
问题描述
我有一个这样的数据框:
df
col1 col2 col3 col4
A 12 34 XX
B 20 25 PP
B nan nan nan
nan P 54 nan
nan R nan nan
nan nan nan PQ
C D 32 SS
R S 32 RS
如果 col1 值为 null 我想添加其他列的所有值,直到它在 col1 中找到 notnull 元素
我正在寻找的数据框应如下所示:
col1 col2 col3 col4
A 12 34 XX
B 20 25 PP
B PR 54 PQ
C D 32 SS
R S 32 RS
如何使用 python/pandas 以最有效的方式进行操作
解决方案
如果想要处理所有列,如字符串首先向前填充缺失值col1
,将NaN
s 替换为空字符串,将所有值转换为strings
并使用sum
:
df['col1'] = df['col1'].ffill()
df = df.set_index('col1').fillna('').astype(str).sum(level=0).reset_index()
print (df)
col1 col2 col3 col4
0 A 12 34.0 XX
1 B PR 54.0 PQ
2 C D 32.0 SS
print (df.dtypes)
col1 object
col2 object
col3 object
col4 object
dtype: object
如果需要仅使用聚合方法处理数字列,例如mean
使用 lambda 函数if-else
:
df['col1'] = df['col1'].ffill()
c = df.select_dtypes(object).columns
df[c] = df[c].fillna('')
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else ''.join(x)
df = df.groupby('col1').agg(f).reset_index()
print (df)
col1 col2 col3 col4
0 A 12 34.0 XX
1 B PR 54.0 PQ
2 C D 32.0 SS
print (df.dtypes)
col1 object
col2 object
col3 float64
col4 object
dtype: object
编辑:使用新的辅助列:
df['new'] = df['col1'].notna().cumsum()
df['col1'] = df['col1'].ffill()
c = df.select_dtypes(object).columns
df[c] = df[c].fillna('')
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else ''.join(x)
df = df.groupby(['col1', 'new']).agg(f).reset_index(level=1, drop=True).reset_index()
推荐阅读
- node.js - 如何在 node.js 上获取类的属性及其方法
- ckeditor - 覆盖 CKEditor 5 内容编辑 css
- npm - 在 bitbucket-pipeline 中运行 nuxt.js 会引发“未定义”错误
- c# - 我决定将两个场景都加载到层次结构中,因为在它们之间引用变量更容易。我怎样才能重新开始一个新游戏?
- python-3.x - 通过python将.mat文件扩展名图像转换为.jpg
- python - 从响应中获取空文件并且无法将文件保存在 django 模型类中
- linux - 如何将目录中的多个 .dav 文件转换为 .mp4
- c# - 类型未标记为可序列化
- java - 如何使用类的字符串属性在 java 中引用该类?
- android - 如何在带有 gradle 插件 3.5.1 的 android 库中使用 productFlavors