如何根据条件移动给定索引的熊猫列元素?

时间:2019-03-29 15:00:43

标签: python pandas dataframe

我最近开始使用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

2 个答案:

答案 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)