【问题标题】:How to replace Pandas DataFrame column range values with their absolute/mean value?如何用它们的绝对值/平均值替换 Pandas DataFrame 列范围值?
【发布时间】:2020-02-06 07:50:00
【问题描述】:

我想通过计算其绝对值/平均值,将 Pandas DataFrame 列的值替换为每个单元格中的范围形式的值。

列值:单个单元格为“46-55”,下一个单元格值为“26-35”,下一个单元格值为“100+”(不带引号)

示例输入:pandas.core.series.Series('46-55', '26-35', '60+')

example input image

预期输出:pandas.core.series.Series('50.5','30.5','60')

example output image

其中,50.5 是 46 和 55 的平均值

【问题讨论】:

标签: python-3.x pandas csv dataframe


【解决方案1】:
a = pd.Series(['46-55', '26-35', '60+'])
>>>a
0    46-55
1    26-35
2      60+
dtype: object

我们可以直接找到每个单元格字符串中的所有数字,并将整个东西作为一个单独的系列输出

b = a.str.findall('(\d+)')
>>>b
0    [46, 55]
1    [26, 35]
2        [60]
dtype: object

现在,我们可以找到我们刚刚创建的新系列的每个元素的平均值,并将其输出为所需的系列

c = pd.Series([])
for i in range(0,len(b)):
    b[i] = np.array(b[i]).astype(np.float)
    c[i] = sum(b[i]) / len(b[i])

>>>c
0    50.5
1    30.5
2    60.0
dtype: float64

【讨论】:

  • 您将整个范围作为列中的所有值,这不是所要求的,场景是单个单元格的值是“46-55”下一个单元格值是“26-35”和下一个单元格值为“100+”(不带引号)
  • @John,我已经编辑了我的回复。我之前误解了这个问题。我希望这对您正在寻找的内容有所帮助。
【解决方案2】:
>>> import pandas as pd

输入

# assuming there is no noise data in age_range (ex. no special char other than -,+)
>>> age_range = pd.Series(('46-55', '26-35', '60+'))
>>> age_range
0    46-55
1    26-35
2      60+
dtype: object

将str范围转换为int范围列表的函数

>>> split_range = lambda age_range : [[int(y) for y in x.split('-')] if len(x.split('-')) == 2 else [int(x.split('+')[0])] for x in age_range]

# test func
>>> alter_age_range = split_range(age_range)
>>> alter_age_range
[[46, 55], [26, 35], [60]]

输出

>>> ages_mean = pd.Series([sum(ages)/len(ages) for ages in split_range(age_range)])
>>> ages_mean
0    50.5
1    30.5
2    60.0
dtype: float64

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2017-04-11
    • 2015-06-04
    相关资源
    最近更新 更多