【问题标题】:Replace values in pandas series where the element to be replaced contains a part of the element by which it is to be replaced替换熊猫系列中的值,其中要替换的元素包含要替换的元素的一部分
【发布时间】:2018-11-05 13:54:59
【问题描述】:

例如,我想用2014 替换2/8/2014 0:00 和用2015 替换1/29/2015 0:00 以及以后。

2014               180657
2015               153837
2014                72395
2012                69708
2013                61364
2015                54117
2013                 3313
2012                 1076
2/8/2014 0:00           2
7/3/2014 0:00           2
1/29/2015 0:00          2
9/1/2014 0:00           2
11/22/2014 0:00         2
10/16/2014 0:00         2

【问题讨论】:

  • 您为什么不直接转换为日期时间并从中获取年份?如果您能展示您尝试过的方法,这将很有帮助,以便我们解释为什么会失败,因为这不是一个需要解决的复杂问题。
  • 好吧,编辑把我彻底搞糊涂了。我们在这里看什么?这是单个数据框吗?
  • 是的,它是一个单一的数据框,我有每年的值计数。大多数“年份”条目的格式不正确,我只能将它们替换为年份。顺便说一句,我对这一切都很陌生,非常感谢您的帮助。
  • 对,所以单列可以包含年份或日期时间?这确实使事情变得相当复杂 :) 它们是该专栏中仅有的两个可能的“事物”吗?

标签: python python-3.x pandas replace


【解决方案1】:

从系列开始,ser

2014               180657
2015               153837
2014                72395
2012                69708
2013                61364
2015                54117
2013                 3313
2012                 1076
2/8/2014 0:00           2
7/3/2014 0:00           2
1/29/2015 0:00          2
9/1/2014 0:00           2
11/22/2014 0:00         2
10/16/2014 0:00         2
dtype: int64

您可以将索引转换为日期时间并提取年份:

ser.index = pd.to_datetime(ser.index, errors='coerce').year
ser

2014    180657
2015    153837
2014     72395
2012     69708
2013     61364
2015     54117
2013      3313
2012      1076
2014         2
2014         2
2015         2
2014         2
2014         2
2014         2
dtype: int64

如果这引入了 NaN,您可以通过以下方式消除它们

ser = ser[ser.index.notnull()]
ser.index = ser.index.astype('int')

如果你想按年份分组,你可以按索引分组:

ser.groupby(level=0).sum()
Out: 
2012     70784
2013     64677
2014    253062
2015    207956
dtype: int64

【讨论】:

  • 呵呵,真没想到to_datetime能这么容忍单列这样的混合格式。
  • @roganjosh 是的,我也一直对 pandas 处理日期时间数据的能力感到惊讶。 :)
  • 和我一样,但通常在this 的意义上,韦斯在同一个问题中以“欢迎来到地狱”开始他的回答:P
  • 我在尝试代码时收到此错误:TypeError: invalid string coercion to datetime
  • 请注意,此解决方案假定整数索引是字符串,您可以通过 s.index.astype(str) 轻松解决此问题。
【解决方案2】:

试试这个:

s = pd.Series(['2017','2/3/2018 6:45'])
s = s.apply(lambda x: x.split()[0][-4:])
print(s)

输出:

0    2017
1    2018
dtype: object

这只是一个虚拟系列

只需将apply 函数用于系列,然后将lambda 添加到参数中,然后将其编入索引

【讨论】:

  • 当条目较少时,这很容易。当我有 5,00,000 个条目时,我该怎么做。抱歉,如果这些问题看起来有点傻,我是熊猫新手。
  • @Akshit 我刚刚尝试了包含 500,000 个条目的解决方案,它仍然有效
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2022-06-13
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多