根据另一个中的值填充新的 pandas df 列
Fill new pandas df column based off values in another
我正在尝试在一个 pandas df
中创建一个新的 column
,该 column
由另一个 column
中的值填充。具体来说,对于下面的 df,我想在 Col['Location']
.
中的 'Home'
值旁边填充 1
import pandas as pd
d = ({
'Day' : ['Mon','Tues','Mon','Wed','Thurs','Fri','Mon','Sat','Sun','Tues'],
'Location' : ['Home','Home','Away','Home','Home','Home','Home','Home','Home','Away'],
})
df = pd.DataFrame(data=d)
我目前正在这样做:
m = lambda x: dict(Home='1').get(x, '')
df = df.assign(Assign=df.Location.map(m))
但是,我想包含 Col['Day']
以更改新的列值。我希望在三个分配中获得 assign
个数字。对于 Day
中的前三个唯一值,我想将它们全部标记为 1
。对于第 4、5、6 个唯一值,我想将它们标记为 2
等
所以对于 Home
df 的 Location
值,Day
中的前 3 个 unique
值是 Mon, Tues, Wed
所以它们旁边都有 1他们。第 4、5、6 个唯一值是 Thurs, Fri, Sat
,所以它们旁边会有 2
。 Sun
结束了 6
所以它会有一个 3
预期输出:
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away
我认为首先只过滤 Home
行,删除重复项并为 map
创建字典 - 但仅适用于过滤的行:
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)
print (df)
Day Location Assign
0 Mon Home 1.0
1 Tues Home 1.0
2 Mon Away NaN
3 Wed Home 1.0
4 Thurs Home 2.0
5 Fri Home 2.0
6 Mon Home 1.0
7 Sat Home 2.0
8 Sun Home 3.0
9 Tues Away NaN
如果想要整数列:
df['Assign'] = np.where(mask, df['Day'].map(d), 0)
print (df)
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away 0
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away 0
如果混合数字与空字符串没有问题:
df['Assign'] = np.where(mask, df['Day'].map(d), '')
print (df)
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away
我正在尝试在一个 pandas df
中创建一个新的 column
,该 column
由另一个 column
中的值填充。具体来说,对于下面的 df,我想在 Col['Location']
.
'Home'
值旁边填充 1
import pandas as pd
d = ({
'Day' : ['Mon','Tues','Mon','Wed','Thurs','Fri','Mon','Sat','Sun','Tues'],
'Location' : ['Home','Home','Away','Home','Home','Home','Home','Home','Home','Away'],
})
df = pd.DataFrame(data=d)
我目前正在这样做:
m = lambda x: dict(Home='1').get(x, '')
df = df.assign(Assign=df.Location.map(m))
但是,我想包含 Col['Day']
以更改新的列值。我希望在三个分配中获得 assign
个数字。对于 Day
中的前三个唯一值,我想将它们全部标记为 1
。对于第 4、5、6 个唯一值,我想将它们标记为 2
等
所以对于 Home
df 的 Location
值,Day
中的前 3 个 unique
值是 Mon, Tues, Wed
所以它们旁边都有 1他们。第 4、5、6 个唯一值是 Thurs, Fri, Sat
,所以它们旁边会有 2
。 Sun
结束了 6
所以它会有一个 3
预期输出:
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away
我认为首先只过滤 Home
行,删除重复项并为 map
创建字典 - 但仅适用于过滤的行:
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)
print (df)
Day Location Assign
0 Mon Home 1.0
1 Tues Home 1.0
2 Mon Away NaN
3 Wed Home 1.0
4 Thurs Home 2.0
5 Fri Home 2.0
6 Mon Home 1.0
7 Sat Home 2.0
8 Sun Home 3.0
9 Tues Away NaN
如果想要整数列:
df['Assign'] = np.where(mask, df['Day'].map(d), 0)
print (df)
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away 0
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away 0
如果混合数字与空字符串没有问题:
df['Assign'] = np.where(mask, df['Day'].map(d), '')
print (df)
Day Location Assign
0 Mon Home 1
1 Tues Home 1
2 Mon Away
3 Wed Home 1
4 Thurs Home 2
5 Fri Home 2
6 Mon Home 1
7 Sat Home 2
8 Sun Home 3
9 Tues Away