我是熊猫的新手,正在尝试完成以下任务:
我有一个看起来像这样的数据框:
row A B
1 abc abc
2 abc
3 abc
4
5 abc abc
我想要的输出看起来像这样:
row A B
1 abc abc
2 abc
3 abc
5 abc abc
如果A列和B列均无值,我将尝试删除行:
if finalized_export_cf[finalized_export_cf['A']].str.len()<2:
if finalized_export_cf[finalized_export_cf['B']].str.len()<2:
finalized_export_cf[finalized_export_cf['B']].drop()
但这给了我以下错误:
ValueError: cannot index with vector containing NA / NaN values
当两列都为空单元格时如何删除值? 谢谢您的建议。
答案 0 :(得分:2)
您可以通过在链中使用.isnull()
和all()
来检查所有行是否都为空。 isnull()
产生一个带有布尔值的数据框,而all(axis=1)
检查给定行中的所有值是否为true。如果是这种情况,则意味着行中的所有值都为空:
inds = df[["A", "B"]].isnull().all(axis=1)
然后,您可以使用inds
来清理所有只有空值的行。首先使用tilda ~
取反它,否则您只能丢失值:
df = df.loc[~inds, :]
答案 1 :(得分:2)
如果缺少的值是NaN
,则将DataFrame.dropna
与all
和子集参数一起使用:
print (df)
row A B
0 1 abc abc
1 2 abc NaN
2 3 NaN abc
3 4 NaN NaN
4 5 abc abc
df = df.dropna(how='all', subset=['A','B'])
print (df)
row A B
0 1 abc abc
1 2 abc NaN
2 3 NaN abc
4 5 abc abc
或者如果空值是空字符串,请使用DataFrame.any
,比较不等于''
:
print (df)
row A B
0 1 abc abc
1 2 abc
2 3 abc
3 4
4 5 abc abc
df = df[df[['A','B']].ne('').any(axis=1)]
print (df)
row A B
0 1 abc abc
1 2 abc
2 3 abc
4 5 abc abc
答案 2 :(得分:2)
对于您的用例,您可以创建一个掩码并获取A和B不是True的值:
mask = df.isna()
df[~((mask.A == True) & (mask.B == True))]
输出:
row A B
0 1 abc abc
1 2 abc NaN
2 3 NaN abc
4 5 abc abc
答案 3 :(得分:1)
如果只有两列-您可以通过将pandas.dataFrame.dropna的how
属性设置为'all':
df.dropna(how='all')
答案 4 :(得分:1)
首先,我们需要将空格更改为NaN
df = df.replace(r'^\s*$',np.nan,regex=True)
然后在设置子行的同时放下na
df.dropna(subset=['A','B'],how='all').fillna(' ') # if you want spaces for na
print(df)
row A B
0 1 abc abc
1 2 abc
2 3 abc
4 5 abc abc