有没有办法根据应用于数据框上两列的两个不同条件来创建新列?
Is there a way to create new columns based on the two different conditions applied to two columns on a data frame?
我有一个相当大的数据集(大约 50000 个条目),其结构如下。
状态编号
距离编号
姓名
32
0
查谟和克什米尔
32
0
查谟和克什米尔
32
0
查谟和克什米尔
32
1
库普瓦拉
32
1
库普瓦拉
32
4
Badgam
32
4
Badgam
32
14
卡图亚
32
14
卡图亚
12
0
阿鲁纳恰尔邦
12
0
阿鲁纳恰尔邦
12
10
地邦谷
12
10
地邦谷
为了解释这一点,州 ID 标识州,如果该特定行的地区 ID 恰好为 0,则意味着该值(在其他列中)适用于整个州。但是,如果地区 ID 恰好是 0 以外的任何其他数字,则该值适用于该特定地区(在州内,由州 ID 给出)
我的目标是为该数据集增加两列,'state_name' 和 'district_name',这样 state_name 由所有 Dist id = 0 的 Name 列填充,并且类似的状态 ID。第二栏district_name填写区名
预期输出如下 table:
状态编号
距离编号
姓名
state_name
district_name
32
0
查谟和克什米尔
查谟和克什米尔
-
32
0
查谟和克什米尔
查谟和克什米尔
-
32
0
查谟和克什米尔
查谟和克什米尔
-
32
1
库普瓦拉
查谟和克什米尔
库普瓦拉
32
1
库普瓦拉
查谟和克什米尔
库普瓦拉
32
4
Badgam
查谟和克什米尔
Badgam
32
4
Badgam
查谟和克什米尔
Badgam
32
14
卡图亚
查谟和克什米尔
卡图亚
32
14
卡图亚
查谟和克什米尔
卡图亚
12
0
阿鲁纳恰尔邦
阿鲁纳恰尔邦
-
12
0
阿鲁纳恰尔邦
阿鲁纳恰尔邦
-
12
10
地邦谷
阿鲁纳恰尔邦
地邦谷
12
10
地邦谷
阿鲁纳恰尔邦
地邦谷
我该怎么做?
IIUC:
尝试通过 loc
访问器和布尔掩码以及 ffill()
方法向前填充 'state_name' 列的值:
df.loc[df['Dist id'].eq(0),'state_name']=df.loc[df['Dist id'].eq(0),'Name']
df.loc[df['Dist id'].ne(0),'district_name']=df.loc[df['Dist id'].ne(0),'Name']
df['state_name']=df['state_name'].ffill()
或
通过np.where()
:
import numpy as np
df['state_name']=np.where(df['Dist id'].eq(0),df['Name'],np.nan)
df['district_name']=np.where(df['Dist id'].ne(0),df['Name'],np.nan)
df['state_name']=df['state_name'].ffill()
df
的输出:
state id Dist id Name state_name district_name
0 32 0 Jammu & Kashmir Jammu & Kashmir NaN
1 32 0 Jammu & Kashmir Jammu & Kashmir NaN
2 32 0 Jammu & Kashmir Jammu & Kashmir NaN
3 32 1 Kupwara Jammu & Kashmir Kupwara
4 32 1 Kupwara Jammu & Kashmir Kupwara
5 32 4 Badgam Jammu & Kashmir Badgam
6 32 4 Badgam Jammu & Kashmir Badgam
7 32 14 Kathua Jammu & Kashmir Kathua
8 32 14 Kathua Jammu & Kashmir Kathua
9 12 0 Arunachal Pradesh Arunachal Pradesh NaN
10 12 0 Arunachal Pradesh Arunachal Pradesh NaN
11 12 10 Dibang Valley Arunachal Pradesh Dibang Valley
12 12 10 Dibang Valley Arunachal Pradesh Dibang Valley
完成此操作的最简单方法是复制学区 ID,然后将适当的 ID 替换为学区名称。
例如,考虑以下数据框:
import pandas as pd
df = pd.DataFrame({'District': [1, 4]})
这些值在后续数据帧中被替换:
df2=df.replace([1], 'Kupwara')
df3=df2.replace([4], 'Badgam')
我有一个相当大的数据集(大约 50000 个条目),其结构如下。
状态编号 | 距离编号 | 姓名 |
---|---|---|
32 | 0 | 查谟和克什米尔 |
32 | 0 | 查谟和克什米尔 |
32 | 0 | 查谟和克什米尔 |
32 | 1 | 库普瓦拉 |
32 | 1 | 库普瓦拉 |
32 | 4 | Badgam |
32 | 4 | Badgam |
32 | 14 | 卡图亚 |
32 | 14 | 卡图亚 |
12 | 0 | 阿鲁纳恰尔邦 |
12 | 0 | 阿鲁纳恰尔邦 |
12 | 10 | 地邦谷 |
12 | 10 | 地邦谷 |
为了解释这一点,州 ID 标识州,如果该特定行的地区 ID 恰好为 0,则意味着该值(在其他列中)适用于整个州。但是,如果地区 ID 恰好是 0 以外的任何其他数字,则该值适用于该特定地区(在州内,由州 ID 给出)
我的目标是为该数据集增加两列,'state_name' 和 'district_name',这样 state_name 由所有 Dist id = 0 的 Name 列填充,并且类似的状态 ID。第二栏district_name填写区名
预期输出如下 table:
状态编号 | 距离编号 | 姓名 | state_name | district_name |
---|---|---|---|---|
32 | 0 | 查谟和克什米尔 | 查谟和克什米尔 | - |
32 | 0 | 查谟和克什米尔 | 查谟和克什米尔 | - |
32 | 0 | 查谟和克什米尔 | 查谟和克什米尔 | - |
32 | 1 | 库普瓦拉 | 查谟和克什米尔 | 库普瓦拉 |
32 | 1 | 库普瓦拉 | 查谟和克什米尔 | 库普瓦拉 |
32 | 4 | Badgam | 查谟和克什米尔 | Badgam |
32 | 4 | Badgam | 查谟和克什米尔 | Badgam |
32 | 14 | 卡图亚 | 查谟和克什米尔 | 卡图亚 |
32 | 14 | 卡图亚 | 查谟和克什米尔 | 卡图亚 |
12 | 0 | 阿鲁纳恰尔邦 | 阿鲁纳恰尔邦 | - |
12 | 0 | 阿鲁纳恰尔邦 | 阿鲁纳恰尔邦 | - |
12 | 10 | 地邦谷 | 阿鲁纳恰尔邦 | 地邦谷 |
12 | 10 | 地邦谷 | 阿鲁纳恰尔邦 | 地邦谷 |
我该怎么做?
IIUC:
尝试通过 loc
访问器和布尔掩码以及 ffill()
方法向前填充 'state_name' 列的值:
df.loc[df['Dist id'].eq(0),'state_name']=df.loc[df['Dist id'].eq(0),'Name']
df.loc[df['Dist id'].ne(0),'district_name']=df.loc[df['Dist id'].ne(0),'Name']
df['state_name']=df['state_name'].ffill()
或
通过np.where()
:
import numpy as np
df['state_name']=np.where(df['Dist id'].eq(0),df['Name'],np.nan)
df['district_name']=np.where(df['Dist id'].ne(0),df['Name'],np.nan)
df['state_name']=df['state_name'].ffill()
df
的输出:
state id Dist id Name state_name district_name
0 32 0 Jammu & Kashmir Jammu & Kashmir NaN
1 32 0 Jammu & Kashmir Jammu & Kashmir NaN
2 32 0 Jammu & Kashmir Jammu & Kashmir NaN
3 32 1 Kupwara Jammu & Kashmir Kupwara
4 32 1 Kupwara Jammu & Kashmir Kupwara
5 32 4 Badgam Jammu & Kashmir Badgam
6 32 4 Badgam Jammu & Kashmir Badgam
7 32 14 Kathua Jammu & Kashmir Kathua
8 32 14 Kathua Jammu & Kashmir Kathua
9 12 0 Arunachal Pradesh Arunachal Pradesh NaN
10 12 0 Arunachal Pradesh Arunachal Pradesh NaN
11 12 10 Dibang Valley Arunachal Pradesh Dibang Valley
12 12 10 Dibang Valley Arunachal Pradesh Dibang Valley
完成此操作的最简单方法是复制学区 ID,然后将适当的 ID 替换为学区名称。
例如,考虑以下数据框:
import pandas as pd
df = pd.DataFrame({'District': [1, 4]})
这些值在后续数据帧中被替换:
df2=df.replace([1], 'Kupwara')
df3=df2.replace([4], 'Badgam')