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