我已经将数据从csv文件导入到程序中,然后使用set_index将“ rule_id”设置为索引。我使用了这段代码:
df = pd.read_excel('stack.xlsx')
df.set_index(['rule_id'])
数据如下:
现在,我想将一列与另一列进行比较,但顺序相反,例如;我想将“ c”数据与“ b”进行比较,然后将“ b”与“ a”进行比较,依此类推,并在比较之后创建另一列,该列包含值为零的列的索引。如果两个列的值都为0,则应在新列中更新Null;如果两个比较值都不是0,则还应在新列中更新Null。 结果应如下所示:
如果您能帮助我,我将无法编写解决该问题的代码。
编辑:较小的编辑。我从一个看起来像这样的excel导入数据,这只是数据的一部分,有多列:
然后我使用我的数据透视表使用此代码来操作数据:
df = df.pivot_table(index = 'rule_id' , columns = ['date'], values = 'rid_fc', fill_value = 0)
现在我的数据如下:
现在,我想将一列与另一列进行比较,但顺序相反,例如;我想将'2019-04-25 16:36:32'数据与'2019-04-25 16:29:05'进行比较,然后将'2019-04-25 16:29:05'与'2019-04进行比较-25 16:14:14',依此类推,然后在比较之后创建另一列,其中包含值为零的列的索引。如果两个列的值都为0,则应在新列中更新Null;如果两个比较值都不是0,则还应在新列中更新Null。
答案 0 :(得分:3)
IIUC您可以尝试:
d={i:e for e,i in enumerate(df.columns)}
m1=df[['c','b']]
m2=df[['b','a']]
df['comp1']=m1.eq(0).dot(m1.columns).map(d)
m3=m2.eq(0).dot(m2.columns)
m3.loc[m3.str.len()!=1]=np.nan
df['comp2']=m3.map(d)
print(df)
a b c comp1 comp2
rule_id
51234 0 7 6 NaN 0.0
53219 0 0 1 1.0 NaN
56195 0 2 2 NaN 0.0
答案 1 :(得分:2)
我建议使用numpy-将移位后的值与logical_and
进行比较,并按np.arange
使用交换顺序和numpy.where
使用DatFrame构造函数创建的范围设置新列:
df = pd.DataFrame({
'a':[0,0,0],
'b':[7,0,2],
'c':[6,1,2],
})
#change order of array
x = df.values[:, ::-1]
#compare for equal 0 and and not equal 0
a = np.logical_and(x[:, 1:] == 0, x[:, :-1] != 0)
#create range from top to 0
b = np.arange(a.shape[1]-1, -1, -1)
#new columns names
c = [f'comp{i+1}' for i in range(x.shape[1] - 1)]
#set values by boolean array a and set values
df1 = pd.DataFrame(np.where(a, b[None, :], np.nan), columns=c, index=df.index)
print (df1)
comp1 comp2
0 NaN 0.0
1 1.0 NaN
2 NaN 0.0
答案 2 :(得分:1)
您可以使用此代码段。我没有时间用循环等完善它,所以请根据要求进行更改。
import pandas as pd
import numpy as np
# Data
print(df.head())
a b c
0 0 7 6
1 0 0 1
2 0 2 2
cp = df.copy()
cp[cp != 0] = 1
cp['comp1'] = cp['a'] + cp['b']
cp['comp2'] = cp['b'] + cp['c']
# Logic
cp = cp.replace([0, 1, 2], [1, np.nan, 0])
cp[['a', 'b', 'c']] = df[['a', 'b', 'c']]
# Results
print(cp.head())
a b c comp1 comp2
0 0 7 6 NaN 0.0
1 0 0 1 1.0 NaN
2 0 2 2 NaN 0.0