【问题标题】:new column base on existing column values基于现有列值的新列
【发布时间】:2019-09-10 07:35:40
【问题描述】:

尝试根据现有列“Temp”值创建新值 ChillFrozen

Temp 包含如下值:

-18.00C
-20.00C
+10.00C
+19.00C
Nan
DRY

如何使用 Pandas 实现它

df = pd.DataFrame({'Temp': ['-18.00C', '+10.00c', 'NaN', 'DRY']})

如果Temp Frozen
如果Temp > 0.0C,则属于Chill
如果Temp 是“Nan”或“DRY”,它将属于NA

预期结果:

Temp_Category
Frozen
Chill
NA
NA

【问题讨论】:

  • 如果值为 0 会发生什么?在正值之前总是有+

标签: python pandas if-statement conditional-statements nan


【解决方案1】:

您可以通过字典提取第一个值和Series.map,但在数字之前总是需要值+-

df = pd.DataFrame({'Temp': ['-18.00C', '+10.00c', 'NaN', 'DRY', '+0c', '20c']})

d = {'-':'Frozen', '+':'Chill'}
df['new1'] = df['Temp'].str[0].map(d)

另一个想法是提取数值,转换为float并使用numpy.sign,但如果有0,输出也是0,所以输出是NaN

pat = r"([-+]?\d*\.\d+|\d+)"
d1 = {1:'Chill', -1:'Frozen', 0:'Chill'}
df['new2'] = np.sign(df['Temp'].str.extract(pat, expand=False).astype(float)).map(d1)

具有2 条件和numpy.select 的解决方案:

pat = r"([-+]?\d*\.\d+|\d+)"
s = df['Temp'].str.extract(pat).astype(float)
df['new3'] = np.select([s >= 0, s < 0], ['Chill','Frozen'], default=np.nan)

如果温度中只有最后一个值不是数字(例如cC),则可以使用to_numeric 并通过索引删除最后一个字符:

s = pd.to_numeric(df['Temp'].str[:-1], errors='coerce')
df['new4'] = np.select([s >= 0, s < 0], ['Chill','Frozen'], default=np.nan)
print (df)
      Temp    new1    new2    new3    new4
0  -18.00C  Frozen  Frozen  Frozen  Frozen
1  +10.00c   Chill   Chill   Chill   Chill
2      NaN     NaN     NaN     nan     nan
3      DRY     NaN     NaN     nan     nan
4      +0c   Chill   Chill   Chill   Chill
5      20c     NaN   Chill   Chill   Chill

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 2017-01-11
    • 1970-01-01
    • 2022-08-11
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多