【问题标题】:create ID column in dataframe based on other column values / Pandas -Python根据其他列值/ Pandas -Python 在数据框中创建 ID 列
【发布时间】:2021-08-27 11:43:49
【问题描述】:

我有一个这样的数据框

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|

谁能帮助我解决这个问题。提前谢谢!

【问题讨论】:

  • 所以您只想为男孩填写 1,为女孩填写 2?
  • 前 6 列中可用的最后一个 ID 是什么。如您所见,有些地方我们需要从L_1 and some places L_2 and some IDs are coming out of L_3 中获取值,我需要获取主ID
  • df['IDs'] = df['L_3'].fillna(df['L_2']).fillna(df['L_1'])
  • 也许您可以创建一个自定义函数,循环遍历 Id 列,检查值是否为 NaN,如果不是,则返回该 Id。然后你把这个函数放在apply() 方法中,你应该得到你的列IDs

标签: python python-3.x pandas dataframe python-2.7


【解决方案1】:

我已经定义了一个自定义函数来检索所需的数据:

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

【讨论】:

    【解决方案2】:
    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_indexes,它给出了列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
    

    如果您愿意,现在可以将 NaNs 替换为空字符串。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 2021-08-24
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多