我最近开始使用python和pandas,请耐心等待。 我有两列数据(数据帧)(A,B),应根据两列之间的某种关系(以列为例,对于给定索引,列A的元素应小于元素B的列),以特定的顺序排列如果不满意,则应从索引开始,仅在不满足条件的情况下将数据移动一行(仅对于A),该条件在整个列的长度内都不满足。如果不满足条件,应将其替换为NaN。
我尝试过shift(1)函数。这仅在第一个元素不满足条件的情况下有效,但是如果存在任何其他元素或多个元素不符合条件,则它将在A列开头而不是在不符合条件的位置创建多个NaN。 / p>
mdata1 = [[3,2],[5,4],[8,6],[10,7],[float('NaN'),9],[float('NaN'),11]]
mdf1 = pd.DataFrame(mdata1,columns=['A','B'])
for xt in range (0,len(mdf1)):
if mdf1.A[xt]>mdf1.B[xt]:
mdf1['A'] = mdf1['A'].shift(1)
实际结果
A B
NaN 2
NaN 4
3.0 6
5.0 7
8.0 9
10.0 11
预期结果
A B
NaN 2
3.0 4
5.0 6
NaN 7
8.0 9
10.0 11
答案 0 :(得分:0)
我不明白您到底想做什么。但是只需更改您的代码,我就能得到预期的结果:
for xt in range (0,len(mdf1)):
if mdf1.A[xt]>mdf1.B[xt]:
mdf1.loc[xt:,'A'] = mdf1[xt:]['A'].shift(1)
shift(1)将整个列/数据帧移动一行,因此您需要从所要使用的索引开始移动以获得所需的内容。
答案 1 :(得分:0)
我将从原始数据帧B列到仅包含A列非NaN值的数据帧做merge_asof
。在新列中删除重复项将为您带来预期的结果:
tmp = pd.merge_asof(mdf1, pd.DataFrame(mdf1.A.dropna().astype(np.int64)),
left_on='B', right_on='A', suffixes=('_x', ''))['A']
mdf1['A'] = np.where(tmp.duplicated(), np.nan, tmp)