pandas.Dataframe快速过滤并修改某一列对应行的值

举个栗子:

   0  1  2
0  A  x  0
1  B  x  0
2  A  x  0
3  B  y  0

如何对上述dataframe进行如下操作并返回一个新的dataframe(或覆盖原有的):
这里先说个大前提,就是这里的A和B只会出现2行,不会有大于或小于两行的情况
先将0列的每个值分组,对每个分组值的1列进行判断
若1列的值相同(比如这里0行和2行都为x),则返回对应行的2列为0,若1列的值不同,则2列返回1

栗子的结果应该如下:

   0  1  2
0  A  x  0
1  B  x  1
2  A  x  0
3  B  y  1

刚开始学pandas模块,dataframe的一些操作还不熟练,求指教,谢谢

阅读 38.2k
3 个回答

听你的描述,应该是只要当前df中有和列0和列1值一样的就是0,不一样的就是1
那就是改变列2的值就行了,可以不用groupby来实现

import pandas as pd

lst = [
    ['A','x',0],
    ['B','x',0],
    ['A','x',0],
    ['B','y',0],
]

df = pd.DataFrame(lst)
df[2] = df.apply(lambda x: map(int, df[(df[0]==x[0])&(df[1]==x[1])].count() <= 1), axis=1)
print df

应该是groupby函数的典型用例

grouped = frame.groupby(0)
grouped.apply(lambda x: len(set(x)) == 1)
新手上路,请多包涵

楼主搞定了吗?我也碰到类似问题,就是类似colA为1的时候colB为一,colA为2的时候colB为二,dfdf.colA==1= 这样赋值不行,如果直接是df[colB]= 这种就行,但这样不能根据筛选值赋值了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题