【问题标题】:Detect odd and even rows Python检测奇数行和偶数行Python
【发布时间】:2019-11-19 09:46:17
【问题描述】:

我需要遍历数据框并检查特定列的奇数行是否等于给定变量(偶数行相同)。

这是我的代码:

mydf = pd.read_excel(test.xlsx, header=0, index= False)
mydf = mydf.sort_values(by='Time') 
if ((mydf['Door Name'].iloc[::2]=='RDC_OUT-1') & (mydf['Door Name'].iloc[1::2]=='RDC_IN-1')):
    for i in range (l):
        mydf['diff'] = mydf['Times'].iloc[1::2].to_numpy() - mydf['Times'].iloc[::2]
        Total = mydf['diff'].sum()
        print('Total: ',Total)

但是当我运行它时,我得到了这个错误:

if ((mydf['Door Name'].iloc[::2]=='RDC_OUT-1') & (mydf['Door Name'].iloc[1::2]=='RDC_IN-1')):

  File "C:\Users\khoul\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 1478, in __nonzero__
    .format(self.__class__.__name__))

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是我的数据框:

 Door name    Time                   Last Name   First Name
 RDC_IN-1     05/08/2019  15:23:00   aa          bb
 RDC_OUT-1    05/08/2019  12:39:00   aa          bb           
 RDC_IN-1     05/08/2019  12:13:00   aa          bb
 RDC_OUT-1    05/08/2019  09:10:00   aa          bb

不知道为什么不接受!

【问题讨论】:

  • 你可以添加一些数据样本,minimal, complete, and verifiable example 吗?
  • mydf.loc[::2,'Door Name']=='RDC_OUT-1' 可以正常工作。但是对于mydf['Times'].iloc[1::2].to_numpy() - mydf['Times'].iloc[::2],您需要相同大小的系列。你确定不同的条件会得到真正的结果吗?
  • @splash58 是的,我做了一个例子,它的长度是偶数
  • @splash58 即使有这个mydf.loc[::2,'Door Name']=='RDC_OUT-1' 它也不起作用,同样的错误
  • (mydf.loc[::2,'Door Name']=='RDC_OUT-1').all() - 仅表示偶数行都包含 ['Door Name']== 'RDC_OUT-1'。但不选择任何东西

标签: python-3.x pandas logical-operators


【解决方案1】:

我的想法是首先用TimeRDC_OUT-1 和下一个RDC_IN-1 值选择所有排序的行,过滤掉另一行:

mydf = df.sort_values(by='Time') 

m1 = mydf['Door name'] == 'RDC_OUT-1'
m2 = mydf['Door name'] == 'RDC_IN-1'

m11 = m1 & m2.shift(-1)
m22 = m1.shift() & m2

df = mydf[m11 | m22]
print (mydf)
   Door name                Time Last Name First Name
3  RDC_OUT-1 2019-05-08 09:10:00        aa         bb
2   RDC_IN-1 2019-05-08 12:13:00        aa         bb
1  RDC_OUT-1 2019-05-08 12:39:00        aa         bb
0   RDC_IN-1 2019-05-08 15:23:00        aa         bb

因此,因为从 cmets 获得相同数量的 INOUT 行解决方案应该可以正常工作:

Total = (df.loc[df['Door name']=='RDC_IN-1','Time'] - 
         df.loc[df['Door name']=='RDC_OUT-1','Time'].to_numpy()).sum()
print('Total: ',Total)
Total:  0 days 05:47:00

【讨论】:

  • 谢谢,但是我需要应用if条件,因为这个脚本会在许多不同内容的excel文件上执行,这只是代码的一部分
  • @A.khou - 你能检查完全改变的答案吗?
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2016-06-19
相关资源
最近更新 更多