python - 如何在保持 NaN 值的同时使用 pandas.melt()?
问题描述
我正在清理一个杂乱的数据框,其中一些需要的信息出现在列名中。此信息应融合到将要创建的单个列中。
index name animal fruit veg
--------------------------------------------------
0 cow animal NaN NaN
1 apple NaN fruit NaN
2 carrot NaN NaN veg
3 dog animal NaN NaN
4 horse animal NaN NaN
5 car NaN NaN NaN
6 pear NaN fruit NaN
7 pepper NaN NaN veg
8 cucumber NaN NaN veg
9 house NaN NaN NaN
我试过使用这个pandas.melt()
函数,但是它返回了很多带有“错误”NaN
值和重复的行。
有些行应该显示NaN
,但只有那些不适合列名中指定的类别的行,所以我不能使用pandas.dropna()
.
此外,我不能确定删除重复项不会删除重要数据。
这是我使用的代码:
import pandas as pd
pd.melt(df, id_vars=['index', 'name'],
value_vars=['animal', 'fruit', 'veg'],
var_name='type')
我需要的结果应该是这样的:
index name type
--------------------------------------------------
0 cow animal
1 apple fruit
2 carrot veg
3 dog animal
4 horse animal
5 car NaN
6 pear fruit
7 pepper veg
8 cucumber veg
9 house NaN
解决方案
您可以这样做(假设索引不是列,而是索引),使用df.ffill()
on axis=1
:
df['type']=df[df.columns[1:]].ffill(axis=1).iloc[:,-1]
#alternatively-> df['type']=df.loc[:,['animal','fruit','veg']].ffill(axis=1).iloc[:,-1]
df_new=df[['name','type']]
print(df_new)
name type
index
0 cow animal
1 apple fruit
2 carrot veg
3 dog animal
4 horse animal
5 car NaN
6 pear fruit
7 pepper veg
8 cucumber veg
9 house NaN
推荐阅读
- machine-learning - 有没有办法在全息视图中选择和标记/注释多个点?
- c# - 为什么这个 foreach 循环缺少类中的属性?
- huawei-mobile-services - 未登录华为帐号时,游戏因不显示悬浮窗而被拒绝怎么办?
- django - 如何使用 Django ORM 执行外部联接?
- ios - iOS 14 小部件背景刷新未发生 - 如何获取诊断/刷新预算计数器信息?
- python-3.x - detect_langs 如何使用输出
- c++ - Clang 错误“未定义模板 std::tuple_size 的隐式实例化
" - c - 关于如何使用 write 函数处理 Unicode char 的说明
- php - Elastic Beanstalk - 主管 - Laravel Horizon - 不自动启动
- discord - Discord.py“Za Warudo”机器人命令