Python 基于索引的条件数据帧创建
我试图添加一个Python 基于索引的条件数据帧创建,python,pandas,numpy,recursion,conditional-statements,Python,Pandas,Numpy,Recursion,Conditional Statements,我试图添加一个True/False列,条件如下: 查找基本行(索引中应该是10),如x10,并查找x11的val1和val2是=然后x10的val1和val2。如果z17的val1和val2是=z10的val1和val2,那么所需的df如下所示: Val1 Val2 x 10 1.05 2.01 x 14 2.98 5.98 x 16 1.01 1.02 y 10 0.02
True
/False
列,条件如下:
查找基本行(索引中应该是10
),如x10
,并查找x11
的val1
和val2
是=
然后x10
的val1
和val2
。如果z17
的val1
和val2
是=
z10
的val1
和val2
,那么所需的df
如下所示:
Val1 Val2
x 10 1.05 2.01
x 14 2.98 5.98
x 16 1.01 1.02
y 10 0.02 0.07
y 11 0.01 0.01
z 10 2.11 1.17
z 12 0.08 0.08
z 13 3.18 7.10
z 17 2.61 1.78
...
..
.
Val1 Val2 Result
x 10 1.05 2.01 False
x 14 2.98 5.98 True
x 16 1.07 1.02 False
y 10 0.02 0.07 False
y 11 0.01 0.01 False
z 10 2.11 1.17 False
z 12 0.08 0.08 False
z 13 3.18 1.17 True
z 17 2.61 1.78 True
...
..
.
基线的结果应始终为false
我从以下几个方面开始:
Val1 Val2
x 10 1.05 2.01
x 14 2.98 5.98
x 16 1.01 1.02
y 10 0.02 0.07
y 11 0.01 0.01
z 10 2.11 1.17
z 12 0.08 0.08
z 13 3.18 7.10
z 17 2.61 1.78
...
..
.
Val1 Val2 Result
x 10 1.05 2.01 False
x 14 2.98 5.98 True
x 16 1.07 1.02 False
y 10 0.02 0.07 False
y 11 0.01 0.01 False
z 10 2.11 1.17 False
z 12 0.08 0.08 False
z 13 3.18 1.17 True
z 17 2.61 1.78 True
...
..
.
但是无法使其工作,会出现什么问题?通过
cumsum
创建密钥后,您可以使用transform
执行groupby
df["Result"] = np.repeat(False, len(df))
for i in range(0, len(df)):
if df[index][i].str.contains("10") == True:
base = df[index][i][0]
for base in df[index]:
if base[i+1]["val1"] > base[i]["val1"] and base[i+1]["val2"] > base[i]["val2"]:
df["Result"][i] = True
else:
df["Result"][i] = False
通过
cumsum
df["Result"] = np.repeat(False, len(df))
for i in range(0, len(df)):
if df[index][i].str.contains("10") == True:
base = df[index][i][0]
for base in df[index]:
if base[i+1]["val1"] > base[i]["val1"] and base[i+1]["val2"] > base[i]["val2"]:
df["Result"][i] = True
else:
df["Result"][i] = False
您可以使用
.groupby().first()
查找基值,并根据.join()
找到原始df的基值:
g=df.groupby(df.index.str.contains('10').cumsum())
s1=g.Val1.transform('first')
s2=g.Val2.transform('first')
df['new']=s1.lt(df.Val1) & s2.lt(df.Val2)
df
Out[119]:
Val1 Val2 new
x 10 1.05 2.01 False
x 14 2.98 5.98 True
x 16 1.01 1.02 False
y 10 0.02 0.07 False
y 11 0.01 0.01 False
z 10 2.11 1.17 False
z 12 0.08 0.08 False
z 13 3.18 7.10 True
z 17 2.61 1.78 True
输出:
df = pd.DataFrame({'Val1': [1.05, 2.98, 1.01, 0.02, 0.01, 2.11, 0.08, 3.18, 2.61], 'Val2': [2.01, 5.98, 1.02, 0.07, 0.01, 1.17, 0.08, 7.10, 1.78]}, index=pd.MultiIndex.from_arrays(arrays=[['x', 'x', 'x', 'y', 'y', 'z', 'z', 'z', 'z'], [10, 14, 16, 10, 11, 10, 12, 13, 17]], names=['letters', 'numbers']))
df = df.join(df.groupby(level=0).first(), rsuffix='_base')
df['Result'] = (df.Val1 >= df.Val1_base) & (df.Val2 >= df.Val2_base)
df.loc[df.index.get_level_values('numbers')==10, 'Result'] = False
您可以使用
.groupby().first()
查找基值,并根据.join()
找到原始df的基值:
g=df.groupby(df.index.str.contains('10').cumsum())
s1=g.Val1.transform('first')
s2=g.Val2.transform('first')
df['new']=s1.lt(df.Val1) & s2.lt(df.Val2)
df
Out[119]:
Val1 Val2 new
x 10 1.05 2.01 False
x 14 2.98 5.98 True
x 16 1.01 1.02 False
y 10 0.02 0.07 False
y 11 0.01 0.01 False
z 10 2.11 1.17 False
z 12 0.08 0.08 False
z 13 3.18 7.10 True
z 17 2.61 1.78 True
输出:
df = pd.DataFrame({'Val1': [1.05, 2.98, 1.01, 0.02, 0.01, 2.11, 0.08, 3.18, 2.61], 'Val2': [2.01, 5.98, 1.02, 0.07, 0.01, 1.17, 0.08, 7.10, 1.78]}, index=pd.MultiIndex.from_arrays(arrays=[['x', 'x', 'x', 'y', 'y', 'z', 'z', 'z', 'z'], [10, 14, 16, 10, 11, 10, 12, 13, 17]], names=['letters', 'numbers']))
df = df.join(df.groupby(level=0).first(), rsuffix='_base')
df['Result'] = (df.Val1 >= df.Val1_base) & (df.Val2 >= df.Val2_base)
df.loc[df.index.get_level_values('numbers')==10, 'Result'] = False
哇!我不知道这样的用法/方法。谢谢你工作快哇!我不知道这样的用法/方法。谢谢你工作快