【问题标题】:Efficiently edit strings and convert to floats in Pandas在 Pandas 中高效地编辑字符串并转换为浮点数
【发布时间】:2017-06-26 17:21:05
【问题描述】:

我有一个大数据集(appx 1GB,例如,在字符串“20000-30000”中给出了一列工资范围。我想删除连字符后的所有内容并转换为浮点数。但这并不总是在那里,所以我还需要有一些条件来检查它是否在那里。

有没有一种快速的 Pandas 方法可以做到这一点,而不是遍历整个列来单独转换每个列?我觉得肯定有,因为这似乎是一个常见问题,但是类似的问题并不能解决大型数据集的问题。

输入示例如下:

df = pd.DataFrame({'salary': ['200 - 300', '400', '400-500', '600', '-']})

df
Out: 
      salary
0  200 - 300
1        400
2    400-500
3        600
4          -

对于这些值,首选输出是:

   salary
0     200
1     400
2     400
3     600
4       0

0 真的可以是任何填充值,我刚刚选择了0。

【问题讨论】:

  • 您能否显示该列的示例数据,显示带有连字符的字符串和没有连字符的字符串之间的区别。并且,这两种情况的预期输出。在没有看到数据的情况下,我假设 df['salary'].apply(lambda x: x.split('-')[0]).astype(int) 应该适合你。

标签: python python-3.x pandas data-analysis


【解决方案1】:

这是使用apply的一种方式

In [111]: df = pd.DataFrame({'salary': ['200 - 300', '400', '400-500', '600', '-']})

In [112]: df['salary'].apply(lambda x: x.split('-')[0].strip()).replace('', '0').astype(int)
Out[112]:
0    200
1    400
2    400
3    600
4      0
Name: salary, dtype: int32

另一个,使用regex 和字符串方法。

In [134]: df['salary'].str.extract('(\d+)', expand=True).fillna(0)
Out[134]:
     0
0  200
1  400
2  400
3  600
4    0

【讨论】:

  • 这很好用,虽然我以前从未遇到过 lambda - 它是如何工作的?谢谢!
  • @skailasa,lambda 是 Python 中用于定义函数的两个关键字之一,另一个是 def。你会经常看到lambda 用于创建单行函数以传递给apply、map 和reduce。这是我发现的关于 Python lambda 函数的最佳文章之一,底部有示例和富有洞察力的 cmets:pythonconquerstheuniverse.wordpress.com/2011/08/29/…
  • @PeterLeimbigler 谢谢,那篇文章很清楚。
【解决方案2】:

考虑数据框df

df = pd.DataFrame(dict(Salary=['200-400', '500', '600-700']))

df

    Salary
0  200-400
1      500
2  600-700

pandas
pd.Series.str.split

df.Salary.str.split('-').str[0].astype(float)

0    200.0
1    500.0
2    600.0
Name: Salary, dtype: float64

numpy
np.core.defchararray.split

splits = np.core.defchararray.split(df.Salary.values.astype(str), '-')
df.assign(Salary=np.array([x[0] for x in splits], dtype=float))

   Salary
0   200.0
1   500.0
2   600.0

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2011-11-25
    • 2020-08-06
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2021-06-24
    • 2016-12-31
    相关资源
    最近更新 更多