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

2024-06-02 12:15:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始使用Python和熊猫,请耐心听我说。 我有两列(A,B)的数据(dataframe),应该根据两列之间的某种关系按特定的顺序排列(假设对于给定的索引,列A的元素应该小于列B的元素),如果关系不满足,数据应该(仅对于A)从条件不满足的索引开始移动一行在整个柱的长度上都满足。在不满足条件的情况下,应该用NaN代替。你知道吗

我试过shift(1)函数。这仅在第一个元素不满足条件时有效,但如果有任何其他元素或多个元素不满足条件,则会在A列的开头而不是不满足条件的位置创建多个NaN。你知道吗

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

Tags: 数据函数元素dataframeshift关系情况nan
2条回答

我将从原始数据帧B列执行merge_asof,到只包含a列中非NaN值的数据帧。在新列中删除重复项将得到预期结果:

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)

我不明白你到底想做什么。但只要修改代码,我就能得到预期的结果:

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)将整个列/数据帧移动一行,因此需要从所处的索引开始移动以获得所需的内容。你知道吗

相关问题 更多 >