有没有办法根据应用于数据框上两列的两个不同条件来创建新列?

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')