【发布时间】:2019-02-17 18:21:25
【问题描述】:
我正在尝试根据另一个 2 中的值在 pandas df 中分配一个新的 column。
在下面的 df 中,对于Location (Home, Away etc) 中的每个单独值,我想为Day 中的第一个3 对应的unique 值分配一个递增的integer。
import pandas as pd
import numpy as np
d = ({
'Time' : ['7:00:00','8:00:00','9:00:00','11:00:00','12:00:00','1:00:00','2:00:00','3:00:00'],
'Day' : ['Mon','Tues','Wed','Thurs','Fri','Thurs','Fri','Sat'],
'Location' : ['Home','Home','Home','Away','Away','Home','Home','Home'],
})
df = pd.DataFrame(data=d)
#Assign values from Home
mask = df['Location'] == 'Home'
df1 = df[mask].drop_duplicates('Day')
d = dict(zip(df1['Day'], np.arange(len(df1)) // 3 + 1))
df.loc[mask, 'Assign'] = df.loc[mask, 'Day'].map(d)
#Assign values from Away
mask = df['Location'] == 'Away'
df1 = df[mask].drop_duplicates('Day')
d = dict(zip(df1['Day'], np.arange(len(df1)) // 3 + 1))
df.loc[mask, 'Assign'] = df.loc[mask, 'Day'].map(d)
输出:
Time Day Location Assign
0 7:00:00 Mon Home 1.0
1 8:00:00 Tues Home 1.0
2 9:00:00 Wed Home 1.0
3 11:00:00 Thurs Away 1.0
4 12:00:00 Fri Away 1.0
5 1:00:00 Thurs Home 2.0
6 2:00:00 Fri Home 2.0
7 3:00:00 Sat Home 2.0
预期输出:
Time Day Location Assign
0 7:00:00 Mon Home 1.0
1 8:00:00 Tues Home 1.0
2 9:00:00 Wed Home 1.0
3 11:00:00 Thurs Away 2.0
4 12:00:00 Fri Away 2.0
5 1:00:00 Thurs Home 3.0
6 2:00:00 Fri Home 3.0
7 3:00:00 Sat Home 3.0
【问题讨论】:
-
'Location'中的连续值的数量最多为 3?还是可以重复超过 3 次? -
这可能会如何发挥作用存在歧义。请展示一个稍微大一点的例子来解释逻辑。比如,如果第四排是星期四在家会怎样?我还有其他几个问题,但是把它们都写下来需要太多时间。你应该做这项工作。
-
@piRSquared,在这种情况下,它仍然是
2,因为它超过了3unique值。然后Row 5将变为3。 -
@gyoza,它可以重复。所以
Mon, Tues, Wed将是1。Thurs, Fri, Sat将是2。它也不必订购。例如,对于 1,它可能是Mon, Fri, Sat,对于2,它可能是Sun, Wed, Mon。这只是第一个3unique值
标签: python pandas dataframe assign