如何解决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
每一行中的值,然后使用
fillna
用 0 替换 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
掩码相同 dtype
的 fliplr
骨架并分配回:
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] 举报,一经查实,本站将立刻删除。