从数据框上的另一列创建一个包含最长字符串(天)的新列

时间:2020-02-03 20:49:36

标签: python pandas dataframe

我有以下数据框:

import pandas as pd

df = pd.DataFrame({'Number_sensor': [0, 1, 1, 2, 3], 
                         'Time_backup_freq': ['2DAY/36 DAY/12DAY', '12DAY/36 DAY', '12DAY/36DAY', 
                                              '2 DAY', '2 DAY/24 DAY']})

print(df)

我想创建一个新列,其中包含传感器备份的最大天数。我希望结果数据框为:

          Number_sensor    Time_backup_freq          NEW_COLUMNS
             0          2DAY/36 DAY/12DAY               36DAY
             1           12DAY/36 DAY                   36DAY        
             1              12DAY/36DAY                 36DAY
             2                2 DAY                     2DAY
             3             2 DAY/24 DAY                 24DAY


df['Time_backup_freq'] = df['Time_backup_freq'].astype(str)

我唯一想到的就是创建一个从最大到最小的数组,像这样:

array_crescent = np.array(['36 DAY', '36DAY', '24 DAY', '12 DAY', '2 DAY', '2DAY'])

但是我不知道如何通过比较较大的日期字符串来迭代数据框。

这次,我有了一个新的数据框,不仅Month还是Hour。您必须修改代码以解决此问题(从现在起100 HOUR <12DAY)

      import pandas as pd

      df = pd.DataFrame({'Number_sensor': [0, 1, 1, 2, 3], 
                         'Time_backup_freq': ['2MO/36 MO/12MO',
                                              '12MO - 36HOUR', 
                                              '12MO/36MO', 
                                              '2 MO/10 HOUR', 
                                              '100 HOUR 24 MO']})

2 个答案:

答案 0 :(得分:1)

使用str.extractall提取所有数字,然后使用GroupBy.max获取每行max

df['NEW_COLUMNS'] = (
    df['Time_backup_freq'].str.extractall('(\d+)').groupby(level=0).max().add('DAY')
)


   Number_sensor   Time_backup_freq NEW_COLUMNS
0              0  2DAY/36 DAY/12DAY       36DAY
1              1       12DAY/36 DAY       36DAY
2              1        12DAY/36DAY       36DAY
3              2              2 DAY        2DAY
4              3       2 DAY/24 DAY       24DAY

答案 1 :(得分:0)

考虑到您的数字始终以/隔开,并具有示例格式(基本上可以按字母顺序排列每个频率),则可以这样获得最大的数字:

>>> import pandas as pd
>>>
>>> df = pd.DataFrame({'Number_sensor': [0, 1, 1, 2, 3],
...                  'Time_backup_freq': ['2DAY/36 DAY/12DAY', '12DAY/36 DAY', '12DAY/36 DAY',
...                                       '2 DAY', '2 DAY/24 DAY']})
>>> df.Time_backup_freq.str.split('/').apply(max)
0    36 DAY
1    36 DAY
2    36 DAY
3     2 DAY
4    24 DAY
Name: Time_backup_freq, dtype: object