【发布时间】:2015-10-02 16:27:40
【问题描述】:
我需要修改一个 python pandas 数据框。考虑
Id Col
1 a
2 a
3 p
3 sp
4 n
4 sn
5 b
6 c
是我的数据框。 ID 3 和 4 出现两次。对于 ID 为 3 的行,Col 具有值 p 和 sp。同样,对于 Id 4,我们在 Col 中看到值 n 和 sn。我想删除对于 Id 3 具有 Col 作为 p 的行和对于 Id 4 具有 Col 作为 n 的行。所以我希望我的数据框看起来像
Id Col
1 a
2 a
3 sp
4 sn
5 b
6 c
所以基本上,这就是我需要做的事情
检查是否有任何重复项。让我们假设重复只成对出现,而不是三倍或更多。
那么如果Col的值相同,那么我们只保留一个这样的行。
- 如果 Col 中的值为 p 和 sp,我想保留有 sp 的行。
- 如果 Col 中的值为 n 和 sn,我想保留有 sn 的行。
我怎样才能做到这一点?
编辑
实际上,理想情况下,我需要在决定删除哪一行之前进行检查。假设我知道 Id 为 3 的多行,对应的 Col 值为
p
sp
现在我想将这些值收集到一个列表中
['p','sp']
并将其发送到类似的函数
def giveMeBest(paramList):
bestVal = ""
for param in paramList:
'''
some logic goes here
'''
return bestVal
然后我只在 Col 中保留值 bestVal 的行。请注意,这也将允许我处理任意数量的重复项。
EDIT2
感谢 rurp 的回答。我只是最后一个请求。我正在尝试通过执行以下操作来清理我的数据框
for x in result:
resVal = getVal(x[1])
'''
getVal returns the appropriate value that i want to be set in
my dataframe. Note that x[1] will denote the array of duplicate values in Col
'''
resData = resData[(resData.Id == x[0]) & (resData.Col!=resVal)]
但这仍然不会删除行
print(resData[resData.Id==3])
Id Col
3 p
3 sp
我什至尝试过
resData = resData.drop(resData[(resData.Id == int(x[0])) & (resData.Col!=resSent)].index)
但它仍然显示重复的行。
如何从我的数据框中删除多行?
解决掉行问题
我是这样做的
idx = []
for x in result:
resVal = getVal(x[1])
idx.append(resData[(resData.Id == x[0]) & (resData.Col!= resVal)].index.tolist())
然后,只是
for j in idx:
resData = resData.drop(j)
【问题讨论】: