【问题标题】:raise ValueError('Series lengths must match to compare') while manipulating dataframe在操作数据帧时引发 ValueError('系列长度必须匹配才能比较')
【发布时间】:2017-04-22 22:59:35
【问题描述】:

我是一名 Python 初学者,正在编写代码来操作数据框以聚合位于两个值之间的行。该值是从数据框本身的值之一中提取的。

a = df_gb1.loc[0,['TimeStamp']]

我使用 a 和 a+0.4 作为两个边界来获取所有行。

df_gb1[df_gb1['TimeStamp'].between(a-0,a+0.4, inclusive=True)]

我不知道更好的方法来实现这个,但它仍然给我这个错误:

就像我之前说的,我对 python 很陌生,所以我不太了解数据类型如何相互配合。似乎a 也是系列。

如何实现我正在尝试做的事情?

【问题讨论】:

  • 您可以添加具有所需输出的数据样本吗?
  • 但似乎首先需要删除[] 以返回标量a = df_gb1.loc[0,'TimeStamp'],然后adatetimenumeric?如果是日期时间,为什么要添加+0.4
  • @jezrael 所以,'TimeStamp' 只是一个 float64 列。它实际上并不是某种特殊类型。

标签: python pandas


【解决方案1】:

我认为您只需要删除 [] 以返回标量 a,否则输出为 Series

df_gb1 = pd.DataFrame({'TimeStamp':[3,3.1,5,7.1,3.4],
                   'a':[4,5,6,7,8]})

print (df_gb1)
   TimeStamp  a
0        3.0  4
1        3.1  5
2        5.0  6
3        7.1  7
4        3.4  8

a = df_gb1.loc[0,'TimeStamp']
print (a)
3.0

print (df_gb1[df_gb1['TimeStamp'].between(a-0,a+0.4, inclusive=True)])
   TimeStamp  a
0        3.0  4
1        3.1  5
4        3.4  8

print (df_gb1.loc[0,['TimeStamp']])
TimeStamp    3.0
Name: 0, dtype: float64

【讨论】:

  • 成功了!我试图了解[] 以何种方式更改了返回的数据类型?
  • a = df_gb1[['TimeStamp']].loc[0]一样——先按子集选择DataFrame的一列,返回Dataframe和一列df_gb1[['TimeStamp']],然后选择第一个值——得到Series
  • 如果需要选择第一行使用a = df_gb1[['TimeStamp', 'a']].loc[0],但如果需要标量使用loc - loc['index_value', 'column_name']
  • 我又卡住了。我想你会有一个想法,但我将'TimeStamp' 的第一个值设为a,然后将所有行都设为a+0.4。现在我正在尝试访问我在上一个语句中得到的最后一个之后的行中的'TimeStamp' 的值。 df_gb1.loc[a.tail(1).index + 1, 'TimeStamp'],但我现在得到一个系列类型值!
  • 没关系,我用nextIndex = a.index[a.index.size - 1] + 1
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2019-08-24
  • 2017-03-25
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多