df内容
A B C
1 1 ""
1 1 1
df.drop_duplicates(subset=['A','B'], keep='first', inplace=False)
A B C
1 1 ""
我想要的结果是
A B C
1 1 1
保留第一个不为“”的C列的值
df内容
A B C
1 1 ""
1 1 1
df.drop_duplicates(subset=['A','B'], keep='first', inplace=False)
A B C
1 1 ""
我想要的结果是
A B C
1 1 1
保留第一个不为“”的C列的值
df
>>> df = [[1,2,''], [1,3,4], [1,2,3], [1,3,3], [1,2,4],[1,4,5], [1,4,6]]
>>> df = pd.DataFrame(a, columns=['A','B','C'])
>>> df
A B C
0 1 2
1 1 3 4
2 1 2 3
3 1 3 3
4 1 2 4
5 1 4 5
6 1 4 6
df.groupby()
方法分组, 而其返回的值是可迭代对象, 该可迭代对象的每一个值是一个元组, 而每一个元组又有两个元素, 第一个元素是你的分组依据, 第二个元素是被你分割出来的DataFrame, 看个例子吧:>>> for i in df.groupby(by=['A','B'],sort=False):
print(i)
print() # 打印个回车分割
((1, 2), A B C
0 1 2
2 1 2 3
4 1 2 4)
((1, 3), A B C
1 1 3 4
3 1 3 3)
((1, 4), A B C
5 1 4 5
6 1 4 6)
应该比较简单吧, 再写个例子:
>>> b = pd.DataFrame([[1,2,''],[1,2,3], [1,2,4]], columns=['A','B','C'])
>>> print(b[b.C != ''].iloc[0])
A 1
B 2
C 3
Name: 1, dtype: object
>>> a.groupby(by=['A','B'],sort=False).apply(lambda x:x[x.C != ''].iloc[0]).reset_index(drop=True)
A B C
0 1 2 3
1 1 3 4
2 1 4 5
DataFrame
中有[1,9,'']
这样一项, 即A,B
, 只出现一次没有重复过, 那就会报错所以推荐自己写一个函数(就是传入apply()
的那个)
给出参考:
def xx(x):
try:
return x[x.C != ''].iloc[0]
except:
return None
但是碰见[1,9,'']
这一项就成了:
A B C
A B
1 2 1.0 2.0 3.0
9 NaN NaN NaN
3 1.0 3.0 4.0
4 1.0 4.0 5.0
所以你还得手动删除那一行
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
你可以增加一个条件筛选,把有空值的那一行去掉,再drop_duplicates