Python 从pandas中的分组赋值

Python 从pandas中的分组赋值,python,pandas,dataframe,multiple-columns,assign,Python,Pandas,Dataframe,Multiple Columns,Assign,我有一个我无法解决的问题。让我们看看你是否能帮助我 我有这个df: df = pd.DataFrame(np.random.randint(0,3,size=(7, 4)),columns=['ONE', 'TWO', 'NAMES', 'FOUR'],index = fechas) df['NAMES'] = ['Peter','Jon',' Mary','Mary','Peter','Peter','Mary'] 假设我想在col name中按名称分组,一旦我这样做了,我想通过最近完成的组

我有一个我无法解决的问题。让我们看看你是否能帮助我

我有这个df:

df = pd.DataFrame(np.random.randint(0,3,size=(7, 4)),columns=['ONE', 'TWO', 'NAMES', 'FOUR'],index = fechas)
df['NAMES'] = ['Peter','Jon',' Mary','Mary','Peter','Peter','Mary']
假设我想在col name中按名称分组,一旦我这样做了,我想通过最近完成的组将col 1的值分配给col 2,遵循我必须将col 1中元素的值分配给col 4中第一个0的整个group by name

这就是我得到的

            ONE  TWO  NAMES  FOUR
1970-01-01    0    0  Peter     0
1970-01-02    2    1    Jon     0
1970-01-03    1    0   Mary     0
1970-01-04    1    1   Mary     0
1970-01-05    0    2  Peter     1
1970-01-06    2    2  Peter     0
1970-01-07    0    0   Mary     1
我需要这样的东西:

            ONE  TWO  NAMES  FOUR
1970-01-01    0    0  Peter     0
1970-01-02    2    1    Jon     0
1970-01-03    1    1   Mary     0
1970-01-04    1    1   Mary     0
1970-01-05    0    0  Peter     1
1970-01-06    2    0  Peter     0
1970-01-07    0    1   Mary     1
我希望这一切都能解释清楚。
谢谢

我想您首先需要按列
4
0
的所有行进行筛选,然后按列
NAMES
进行筛选,保留第一个值。然后将
dict
NAMES
转换为键,将
ONE
转换为值,并:


我有一个巨大的df,我想根据一列的值进行分组。然后我想检查组中的哪个元素在另一列中有60000,这将是“父亲”,将他的值从另一个第三列传递到另一个第四列。很难解释如果很难解释,那么你还没有准备好问这个问题。@jezrael刚刚掌握了逻辑,但他的代码根本不起作用。所以这不是一个猜谜游戏,你模糊地描述了一个问题,然后谁最接近你的意图,谁就赢了一个奖。我无意浪费你的时间,我真的无法更好地解释它。非常抱歉并感谢您阅读。我认为
TWO
列中的值
Jon
2
,因为
FOUR
列中的值是第一个
0
。这不太合适。一个两个名字四个1970-01-01 0 0.0彼得0 1970-01-02 2 2.0乔恩0 1970-01-03 2 2.0玛丽0 1970-01-04南玛丽2 1970-01-05 2 0.0彼得1 1970-01-06 2 0.0彼得0 1970-01-07南玛丽1注意到,第二个和第三个玛丽的第二列应该是2.0很好。谢谢你的帮助,我会再查的@jezraelI认为问题在于
randint
,因为若运行代码,会得到不同的输出。更好的方法是使用
np.random.seed(123)
测试相同的输出。好的,现在我确实理解了您的解决方案,它可能会工作。问题是,在我的真实案例中,所有的名称组都将有一个0。非常感谢。
df = pd.DataFrame({
'ONE': [0, 2, 1, 1, 0, 2, 0], 
'TWO': [0, 1, 0, 1, 2, 2, 0], 
'NAMES': ['Peter', 'Jon', 'Mary', 'Mary', 'Peter', 'Peter', 'Mary'], 
'FOUR': [0, 0, 0, 0, 1, 0, 1]})
df = df[['ONE', 'TWO', 'NAMES', 'FOUR']]
print (df)
   ONE  TWO  NAMES  FOUR
0    0    0  Peter     0
1    2    1    Jon     0
2    1    0   Mary     0
3    1    1   Mary     0
4    0    2  Peter     1
5    2    2  Peter     0
6    0    0   Mary     1
print (df[df.FOUR == 0].drop_duplicates(['NAMES']))
   ONE  TWO  NAMES  FOUR
0    0    0  Peter     0
1    2    1    Jon     0
2    1    0   Mary     0

d = df[df.FOUR == 0].drop_duplicates(['NAMES']).set_index('NAMES')['ONE'].to_dict()
print (d)
{'Jon': 2, 'Mary': 1, 'Peter': 0}

df.TWO = df.NAMES.map(d)
print (df)
            ONE  TWO  NAMES  FOUR
1970-01-01    0    0  Peter     0
1970-01-02    2    2    Jon     0
1970-01-03    1    1   Mary     0
1970-01-04    1    1   Mary     0
1970-01-05    0    0  Peter     1
1970-01-06    2    0  Peter     0
1970-01-07    0    1   Mary     1