根据其他列值在数据框中创建 ID 列 / Pandas -Python
create ID column in dataframe based on other column values / Pandas -Python
我有一个这样的数据框
L_1 D_1 L_2 D_2 L_3 D_3 C_N
1 Boy Boy||
1 Boy 1-1 play Boy|play|
1 Boy 1-1 play 1-1-21 car Boy|play|car
1 Boy 1-1 play 1-1-1 online Boy|play|online
2 Girl Girl||
2 Girl 2-1 dance Girl|dance|
我使用代码
创建了C_N
标签
df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)
现在我想要另一列,我也可以在其中获取特定组的 ID,我的理想输出是:
L_1 D_1 L_2 D_2 L_3 D_3 IDs C_N
1 Boy 1 Boy||
1 Boy 1-1 play 1-1 Boy|play|
1 Boy 1-1 play 1-1-21 car 1-1-21 Boy|play|car
1 Boy 1-1 play 1-1-1 online 1-1-1 Boy|play|online
2 Girl 2 Girl||
2 Girl 2-1 dance 2-1 Girl|dance|
谁能帮我解决这个问题。提前致谢!
df = df.replace("^\s*$", np.nan, regex=True)
id_inds = df.filter(like="L_").agg(pd.Series.last_valid_index, axis=1)
# either this (but deprecated..)
df["IDs"] = df.lookup(df.index, id_inds)
# or this
df["IDs"] = df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(id_inds)]
首先,我们用 NaN
替换空单元格,然后查看 L_*
列。获取他们的 last_valid_index
es,它给出列 names。然后我们可以 lookup
(已弃用),或者转到 numpy 值并使用 get_indexer
、
进行花式索引
得到
>>> df
L_1 D_1 L_2 D_2 L_3 D_3 C_N IDs
0 1 Boy NaN NaN NaN NaN Boy|| 1
1 1 Boy 1-1 play NaN NaN Boy|play| 1-1
2 1 Boy 1-1 play 1-1-21 car Boy|play|car 1-1-21
3 1 Boy 1-1 play 1-1-1 online Boy|play|online 1-1-1
4 2 Girl NaN NaN NaN NaN Girl|| 2
5 2 Girl 2-1 dance NaN NaN Girl|dance| 2-1
您现在可以根据需要用空字符串替换 NaN
s。
我已经定义了一个自定义函数来检索所需的数据:
df = pd.DataFrame([
['1', 'Boy','','','',''],
['1', 'Boy','1-1','play','',''],
['1', 'Boy','1-1','play','1-1-21','car'],
['1', 'Boy','1-1','play','1-1-1','online'],
['2', 'Girl','','','',''],
['2', 'Girl','','dance','','']], columns=['L_1','D_1','L_2','D_2','L_3','D_3']
)
df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)
def get_data(x,y,z):
result = []
if x != '':
result.append(x)
if y != '':
result.append(y)
if z != '':
result.append(z)
return result[-1]
df['IDs'] = ''
df['IDs'] = df.apply(lambda row: get_data(row['L_1'], row['L_2'], row['L_3']), axis=1)
输出df
我有一个这样的数据框
L_1 D_1 L_2 D_2 L_3 D_3 C_N
1 Boy Boy||
1 Boy 1-1 play Boy|play|
1 Boy 1-1 play 1-1-21 car Boy|play|car
1 Boy 1-1 play 1-1-1 online Boy|play|online
2 Girl Girl||
2 Girl 2-1 dance Girl|dance|
我使用代码
创建了C_N
标签
df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)
现在我想要另一列,我也可以在其中获取特定组的 ID,我的理想输出是:
L_1 D_1 L_2 D_2 L_3 D_3 IDs C_N
1 Boy 1 Boy||
1 Boy 1-1 play 1-1 Boy|play|
1 Boy 1-1 play 1-1-21 car 1-1-21 Boy|play|car
1 Boy 1-1 play 1-1-1 online 1-1-1 Boy|play|online
2 Girl 2 Girl||
2 Girl 2-1 dance 2-1 Girl|dance|
谁能帮我解决这个问题。提前致谢!
df = df.replace("^\s*$", np.nan, regex=True)
id_inds = df.filter(like="L_").agg(pd.Series.last_valid_index, axis=1)
# either this (but deprecated..)
df["IDs"] = df.lookup(df.index, id_inds)
# or this
df["IDs"] = df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(id_inds)]
首先,我们用 NaN
替换空单元格,然后查看 L_*
列。获取他们的 last_valid_index
es,它给出列 names。然后我们可以 lookup
(已弃用),或者转到 numpy 值并使用 get_indexer
、
得到
>>> df
L_1 D_1 L_2 D_2 L_3 D_3 C_N IDs
0 1 Boy NaN NaN NaN NaN Boy|| 1
1 1 Boy 1-1 play NaN NaN Boy|play| 1-1
2 1 Boy 1-1 play 1-1-21 car Boy|play|car 1-1-21
3 1 Boy 1-1 play 1-1-1 online Boy|play|online 1-1-1
4 2 Girl NaN NaN NaN NaN Girl|| 2
5 2 Girl 2-1 dance NaN NaN Girl|dance| 2-1
您现在可以根据需要用空字符串替换 NaN
s。
我已经定义了一个自定义函数来检索所需的数据:
df = pd.DataFrame([
['1', 'Boy','','','',''],
['1', 'Boy','1-1','play','',''],
['1', 'Boy','1-1','play','1-1-21','car'],
['1', 'Boy','1-1','play','1-1-1','online'],
['2', 'Girl','','','',''],
['2', 'Girl','','dance','','']], columns=['L_1','D_1','L_2','D_2','L_3','D_3']
)
df['C_N'] = df[['D_1','D_2', 'D_3']].apply(lambda x: '|'.join(x), axis=1)
def get_data(x,y,z):
result = []
if x != '':
result.append(x)
if y != '':
result.append(y)
if z != '':
result.append(z)
return result[-1]
df['IDs'] = ''
df['IDs'] = df.apply(lambda row: get_data(row['L_1'], row['L_2'], row['L_3']), axis=1)
输出df