微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 数据框根据行索引向左移动行值

如何解决Python 数据框根据行索引向左移动行值

我的桌子是这样的:

import pandas as pd
data = [[20,15,10,5],[20,5]]
df = pd.DataFrame(data,columns = ['one','two','three','four'])
df
一个 三个
20 15 10 5
20 15 10 5
20 15 10 5
20 15 10 5

我想根据行索引移动每一行的值。 索引为 0 的行值保持不变,索引为 1 的行值向左移动一点,索引为 2 的行值向左移动两点,依此类推... 所需的表应如下所示:

一个 三个
20 15 10 5
15 10 5 0
10 5 0 0
5 0 0 0

谢谢你帮助我!

解决方法

另一种方法是使用一个简单的循环来 shift 每一行中的值,然后使用 fillna0 替换 NA 值:

for i in range(len(df)):
    df.iloc[i,:] = df.iloc[i,:].shift(-i)

df.fillna(0,inplace=True)

输出:

>>> df
   one   two  three  four
0   20  15.0   10.0   5.0
1   15  10.0    5.0   0.0
2   10   5.0    0.0   0.0
3    5   0.0    0.0   0.0
,

您可以使用一种方法,将索引值左移并用 0 填充

import pandas as pd


def rotate_row(row):
    return pd.Series(row.to_list()[row.name:] + [0] * row.name,index=row.index)


data = [[20,15,10,5],[20,5]]
df = pd.DataFrame(data,columns=['one','two','three','four'])
df = df.apply(rotate_row,axis=1)
print(df)
   one  two  three  four
0   20   15     10     5
1   15   10      5     0
2   10    5      0     0
3    5    0      0     0
,

右上三角形到左上三角形的方法:

使用 np.triu + np.ones + DataFrame.shape 创建一个遮罩来抓取 DataFrame 的上三角形

let result = Object.entries(inputObject)
.map(([k,v]) => [k,v === 'Yes'? true : v === 'No' ? false : v]);

console.log(result);
mask = np.triu(np.ones(df.shape,dtype=bool))

从 DataFrame 的 values 中获取相应的值:

[[ True  True  True  True]
 [False  True  True  True]
 [False False  True  True]
 [False False False  True]]
a = df.values[mask]

创建与 [20 15 10 5 15 10 5 10 5 5] np.zeros 掩码相同 dtypefliplr 骨架并分配回:

a
tri = np.zeros(df.shape,dtype=a.dtype)
tri[np.fliplr(mask)] = a

变回数据帧:

[[20 15 10  5]
 [15 10  5  0]
 [10  5  0  0]
 [ 5  0  0  0]]

new_df = pd.DataFrame(tri,columns=df.columns)

new_df

完整的工作示例:

   one  two  three  four
0   20   15     10     5
1   15   10      5     0
2   10    5      0     0
3    5    0      0     0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。