如何将DataFrame中的Series逆序生成新列?解决iloc无效问题
问题描述
我有一个包含“Currency”和“Order”列的pandas DataFrame,代码如下:
import pandas as pd data = [["US Dollar", 7.00], ['Euro', 2.00], ['British Pound', 4.00], ['Indian Rupee', 2.00], ['Australian Dollar', 9.00], ['Canadian Dollar', 3.00], ['Singapore Dollar', 3.00], ['Swiss Franc', 5.00] ] df = pd.DataFrame(data, columns=['Currency', 'Order'])
尝试用df['Reverse Order'] = df['Order'].iloc[::-1]将Order列逆序存入新列,但新列与原列顺序完全一致:
# Currency Order Reverse Order # 0 US Dollar 7.0 7.0 # 1 Euro 2.0 2.0 # 2 British Pound 4.0 4.0 # 3 Indian Rupee 2.0 2.0 # 4 Australian Dollar 9.0 9.0 # 5 Canadian Dollar 3.0 3.0 # 6 Singapore Dollar 3.0 3.0 # 7 Swiss Franc 5.0 5.0
期望得到的逆序结果:
# Currency Order Reverse Order # 0 US Dollar 7.0 5.0 # 1 Euro 2.0 3.0 # 2 British Pound 4.0 3.0 # 3 Indian Rupee 2.0 9.0 # 4 Australian Dollar 9.0 2.0 # 5 Canadian Dollar 3.0 4.0 # 6 Singapore Dollar 3.0 2.0 # 7 Swiss Franc 5.0 7.0
如何正确实现这一需求?
解决方案
问题根源:df['Order'].iloc[::-1]返回的Series保留原索引,pandas赋值时会按索引匹配数据,导致新列与原列一致。以下是几种可行的解决方法:
方法1:提取逆序后的数值数组
直接取逆序后的values(或to_numpy()),得到无索引的数组,赋值时按位置填充:
df['Reverse Order'] = df['Order'].iloc[::-1].values
方法2:重置逆序Series的索引
用reset_index(drop=True)移除原索引,生成连续新索引,确保按位置匹配:
df['Reverse Order'] = df['Order'].iloc[::-1].reset_index(drop=True)
方法3:借助numpy反转数组
使用numpy.flip直接反转Order列的数组:
import numpy as np df['Reverse Order'] = np.flip(df['Order'].values)
方法4:链式操作赋值
用assign方法实现链式赋值:
df = df.assign(**{'Reverse Order': df['Order'].iloc[::-1].values})
以上方法均可得到期望的逆序结果。
内容的提问来源于stack exchange,提问作者Jesse Sealand
相关产品推荐
相关产品推荐

