【问题标题】:Change other Column value when apply on Series in Pandas应用于熊猫系列时更改其他列值
【发布时间】:2020-12-22 17:18:05
【问题描述】:

所以我有点迷路了。我基本上有以下df:

df = pd.DataFrame({'period':['Wk20-20','Wkend', 'Wk42-20', 'Q'],
'value': [None, '21-12', None, '4']})
    period  value
0   Wk20-20 None
1   Wkend   21-12
2   Wk42-20 None
3   Q       4

现在我想将类似于“Wk20-20”的值拆分为“周”作为周期列,将 20-20 作为值。

我尝试应用以下功能:

def transform(row):
    
    if re.match(r'Wk\d\d-\d\d', str(row["Description"])):
        print(type(row['Period_Date']))
        row['Period_Date'] = row['Description'].split('Wk')[1]
        return 'Week'
    if row["Description"] == 'Wkend':
        return 'Wkend'
    if row["Description"] == 'Q':
        return 'Quarter'
df['Description'] = df.apply(lambda row: transform(row), axis=1)

这行得通!我很惊讶,因为我只是在 stackoverflow 上给出这个例子时才注意到它有效。

    Description Period_Date
0   Week        20-20
1   Wkend       21-12-2020
2   Week        42-20
3   Quarter     4 

现在我完全迷失了,因为我有或多或少完全相同的数据框(还有几列),但它在那个数据框上不起作用。我完全不知道为什么。 当我从这个数据框中选择一堆列时,它会再次起作用。当我选择更多列时,它不再起作用了..有什么想法吗?

编辑:确切地说,它返回这个df:

    period  value
0   Week    None
1   Wkend   21-12
2   Week    None
3   Q       4

所以它改变的是周期列,而不是值

【问题讨论】:

    标签: python pandas dataframe row apply


    【解决方案1】:

    让我们试试这个:

    # extract period and values
    s = df.period.str.extract('(\D+)(\d+-\d+)')
    
    # where period and values are combined
    mixed_period = s[0].notnull()
    
    df['period'] = np.where(mixed_period, s[0], df['period'])
    df['value'] = np.where(mixed_period, s[1], df['value']) 
    

    或与命名捕获组非常相似的方法:

    s = df.period.str.extract('(?P<period>\D+)(?P<value>\d+-\d+)')
    df.update(s)
    

    输出:

      period  value
    0     Wk  20-20
    1  Wkend  21-12
    2     Wk  42-20
    3   Year   2020
    

    【讨论】:

    • 谢谢你,这确实有效。我想用 .apply 函数尝试它的主要原因是我也可以转换其他值(如果 period = Q 它变成季度等),也可以很好地将代码放在函数中。另外,为什么它不起作用仍然很奇怪
    【解决方案2】:

    apply 比较慢。因此,如果可能的话,我们可以找到如下替代方案:

    代码:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'period':['Wk20-20','Wkend', 'Wk42-20', 'Year'],
    'value': [None, '21-12', None, '2020']})
    
    new = df.period.str.split('Wk', expand=True)
    df['new_value'] = np.where(df.period.str.contains('Wk\d\d-\d\d'), new[1], df.value)
    df["new_period"] = np.where(df.period.str.contains('Wk\d\d-\d\d'), 'Wkend', df.period)
    print(df)
    

    输出:

        period  value new_value new_period
    0  Wk20-20   None     20-20      Wkend
    1    Wkend  21-12     21-12      Wkend
    2  Wk42-20   None     42-20      Wkend
    3     Year   2020      2020       Year
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2021-07-28
      • 2020-05-12
      • 2017-03-11
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多