![](/img/trans.png)
[英]Python : Transposing a column with multiple values in each row into column headers
[英]Python change column values - each row at a time
我有一个具有以下列的数据框 df
A B C D
06/09/2019 56 67 33 10
06/10/2019 54 66 47 23
06/11/2019 67 1 43 19
06/12/2019 21 38 8 71
我有两个具有下限 (l) 和上限 (u) 的数据框
下_df:
l
06/09/2019 20
06/10/2019 12
06/11/2019 10
06/12/2019 15
上_df:
u
06/09/2019 60
06/10/2019 70
06/11/2019 55
06/12/2019 50
我想使用两个数据帧(lower_df 和 upper_df)的值作为条件将第一个数据帧(df)列的值更新为 0。 这里每一行都是孤立的,每一列都与相应的 u & l 值进行比较。 小于 l 且大于 u 的值设置为零。
需要的结果:
A B C D
06/09/2019 56 0 33 0
06/10/2019 54 66 47 23
06/11/2019 0 0 43 19
06/12/2019 21 38 0 0
我使用以下代码从数据框中提取每一行并将列与此上限和下限进行比较:
for i in range(0,len(df)):
ul=upper_df.iloc[i]
ll=lower_df.iloc[i]
df.iloc[i][df.iloc[i]<ll[0]]=0
df.iloc[i][df.iloc[i]>ul[0]]=0
但这并没有反映任何变化,df 保持原样。 代码正确吗? 如果不是,那么正确的方法是什么。 这个数据集很大(很多列,这是一个例子),我正在寻找一种更聪明的方法来做到这一点。
使用DataFrame.mask
与由DataFrame.lt
和DataFrame.gt
链接的比较|
对于按位OR
:
df = df.mask(df.lt(lower_df['l'], axis=0) | df.gt(upper_df['u'], axis=0), 0)
print (df)
A B C D
06/09/2019 56 0 33 0
06/10/2019 54 66 47 23
06/11/2019 0 0 43 19
06/12/2019 21 38 0 0
IIUC,这是另一种方式:
df = df.mul((lower_df.values < df.values) & (
df.values < upper_df.values).astype(int))
输出:
A B C D
06/09/2019 56 0 33 0
06/10/2019 54 66 47 23
06/11/2019 0 0 43 19
06/12/2019 21 38 0 0
这是因为您没有将它们保存到 df 中。 另外,还有一个简洁的 numpy 函数 np.where(),参见https://numpy.org/doc/1.20/reference/generated/numpy.where.html 。
for i in range(0,len(df)):
ul=upper_df.iloc[i]
ll=lower_df.iloc[i]
df.loc[i] = np.where(np.logical_or(df.loc[i] <= ll, df.loc[i] >= ul), 0, df.loc[i])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.