Python Can';t使用iloc摆脱列标签

Python Can';t使用iloc摆脱列标签,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个大的csv(15行和2500列),并试图将每行中的值与上面的行进行比较。为此,我使用pandas中的iloc将每一行拆分为它自己的数据帧。因此,现在我有15个数据帧,我可以尝试使用compare()相互比较。问题是,我不断得到错误只能比较相同标记的数据帧对象,但当将每个数据帧放入csv时,它们都被标记为相同的东西,所以我想,如果我去掉了可以工作和尝试的标签,而没有工作,那么我尝试按显示的方式对索引进行排序,我仍然得到相同的结果错误。CSV中主要是浮点数和偶尔的NaN值 我使用df_I=d

我有一个大的csv(15行和2500列),并试图将每行中的值与上面的行进行比较。为此,我使用pandas中的
iloc
将每一行拆分为它自己的数据帧。因此,现在我有15个数据帧,我可以尝试使用
compare()
相互比较。问题是,我不断得到错误
只能比较相同标记的数据帧对象
,但当将每个数据帧放入csv时,它们都被标记为相同的东西,所以我想,如果我去掉了可以工作和尝试的标签,而没有工作,那么我尝试按显示的方式对索引进行排序,我仍然得到相同的结果错误。CSV中主要是浮点数和偶尔的NaN值

我使用
df_I=df使用
iloc将其拆分。iloc[[I]]
其中
I
被替换为1-14,以获得作为数据帧的每一行

打印数据帧可提供以下输出:

                        TIME  EVENT  Unld1Comp1Circ2_Dout.Val  ...  WorkingHours.Start_Count_14.Cnt  WorkingHours.Start_Count_15.Cnt  WorkingHours.Start_Count_16.Cnt
1  2020-12-15T17:23:55+01:00    NaN                         1  ...                                0                                0                                0

[1 rows x 2463 columns] 
                         TIME  EVENT  Unld1Comp1Circ2_Dout.Val  ...  WorkingHours.Start_Count_14.Cnt  WorkingHours.Start_Count_15.Cnt  WorkingHours.Start_Count_16.Cnt
2  2020-12-15T17:24:13+01:00    NaN                         1  ...                                0                                0                                0

[1 rows x 2463 columns]


有几种方法可以找出数据帧中两行之间的差异

选项1:

for col in df.columns[2:]: #check column by column from 3rd column thru the end

    if df[col].nunique() > 1:
        print (col, df[col].unique())
这将打印具有不同值的所有列。如果
nunique()
大于1,则该列中有多个值。但是,这不会告诉您哪一行有差异

备选案文2:

另一种方法是执行
df[col].shift()
并与前一行进行比较。如果有差异,就记录下来。对每行执行相同的比较。合并所有差异,您将得到下一行之间至少有一个值不同的所有行的列表

为此,您可以执行以下操作:

import pandas as pd
df = pd.DataFrame({'col1':[1,1,1,1,1,1,1,1],
                   'col2':[2,2,2,2,2,2,2,2],
                   'col3':[3,3,3,3,3,3,3,4],
                   'col4':[4,4,4,4,4,4,5,4],
                   'col5':[5,5,5,5,5,1,5,5]})
print (df)

df['Differs'] = False #set all rows to matched 

for col in df.columns[2:]: #check column by column from 3rd column thru the end

    #if df[col].nunique() > 1:
        #print (col, df[col].unique())

    df['newcol1'] = df[col].shift() != df[col] #check against next row. True if differs
    df.loc[:0,'newcol1'] = False # Tweak the first row as it should be ignored
    
    df.loc[df['newcol1'] == True,'Differs'] = True #if any row matched, set Differs to True

print (df[df['Differs']]) #print all rows that has a different value in at least one column 
在上面的示例中,行3、4、5至少有一个不同于前一行的值

对于以下给定的数据帧:

   col1  col2  col3  col4  col5
0     1     2     3     4     5
1     1     2     3     4     5
2     1     2     3     4     5
3     1     2     3     4     5
4     1     2     3     4     5
5     1     2     3     4     1
6     1     2     3     5     5
7     1     2     4     4     5
输出将是:

   col1  col2  col3  col4  col5  Differs  newcol1
5     1     2     3     4     1     True     True
6     1     2     3     5     5     True    False
7     1     2     4     4     5     True    False
使用这两种技术,我进行了比较

选项1结果:

for col in df.columns[2:]: #check column by column from 3rd column thru the end

    if df[col].nunique() > 1:
        print (col, df[col].unique())
所有这些列都有多个值。这些值位于列名旁边的列表中

AFreezeSetP [-39.666669 -39.333334]
AFreezeUserT_1K [23 19]
UserPmp1_On [0 1]
RunTempRegKp [3.111111 3.444445]
RunTempRegTi [399 398]
RunTempRegTd [99 96]
RegSetP [-27.333334 -26.888891]
CoolSetP [-27.333334 -26.888891]
AFreezeUserDiff [29.833334 29.777778]
AFreezeDiff [2.       1.944445]
W_OutTempUserPrb.Val [-24.488002 -24.478   ]
DscgP_Prb_Circ1.Val [-4.287679 -4.291988]
W_OutTempUser [-24.488002 -24.478   ]
DscgP_Circ1 [-4.287679 -4.291988]
SuctTempCirc1 [-174.8 -174.7]
RegTypStartup [1 2]
RegTypRun [1 0]
SuctSH_Circ1 [225.2 225.3]
UserPmp1_Dout.Val [0 1]
UserPmp1_Aout.Val [  0. 100.]
UserPmp1HrsThrsh [4377 4378]
HiW_TempStartupDT [59 55]
HiW_TempRunDT [181 186]
HiW_TempOfs [11.166667 11.444445]
DscgP_Circ2 [-4.287679 -4.291988]
SuctTempCirc2 [-174.8 -174.7]
DscgP_Prb_Circ2.Val [-4.287679 -4.291988]
SuctSH_Circ2 [225.2 225.3]
WorkingHours.UserPmp1Starts [0 1]
W_UserTempReg [-24.488002 -24.478    -78.805   ]
At_SP_Dout.Val [0 1]
SonicDensitySensor.SonicDensity_1.EnSensor [0 1]
选项2结果是除第1行之外的所有行。这说明每行(1到15)之间至少有一个值不同。您可以调整我的代码,找出每列不同的特定行和列

                         TIME  EVENT  ...  Differs  newcol1
1   2020-12-15T17:23:55+01:00    NaN  ...     True     True
2   2020-12-15T17:24:13+01:00    NaN  ...     True    False
3   2020-12-15T17:24:24+01:00    NaN  ...     True    False
4   2020-12-15T17:24:26+01:00    NaN  ...     True    False
5   2020-12-15T17:24:29+01:00    NaN  ...     True    False
6   2020-12-15T17:24:32+01:00    NaN  ...     True    False
7   2020-12-15T17:24:35+01:00    NaN  ...     True    False
8   2020-12-15T17:24:40+01:00    NaN  ...     True    False
9   2020-12-15T17:24:42+01:00    NaN  ...     True    False
10  2020-12-15T17:24:43+01:00    NaN  ...     True    False
11  2020-12-15T17:24:53+01:00    NaN  ...     True    False
12  2020-12-15T17:24:55+01:00    NaN  ...     True    False
13  2020-12-15T17:25:01+01:00    NaN  ...     True    False
14  2020-12-15T17:25:02+01:00    NaN  ...     True    False

你能展示一下你是如何用iloc把每一行分开的吗?也许问题是there@TheNiv我在帖子上加了这个。你考虑过这个方法吗?这可能更容易。@NickODell这绝对是个好主意,但不幸的是,有2500列,我想不出一个简单的方法来处理所有列。在使用iloc拆分列之前,您是否可以共享原始数据?必须有一个更简单的方法。您正在尝试比较第3列到第2463列的行吗?谢谢。我想我必须修改第一个选项,看看我是否能找到一种方法,让它给我行和列,因为我的老板不希望那里只是一个真的假,因为这意味着,对于每一个实例,你都必须通过查看2500列的整个过程来找出差异。