Skip to main content
 首页 » 编程设计

python之如何在不丢失索引的情况下转换 pandas 中的数据框

2025年05月04日31lyhabc

我需要在我的 12 列数据框中调整两列。

例如,我有“A”、“B”、“C”和“D”列,每个列都有一系列值。考虑到我清理了一些 NaN 列,列数从 100 减少到 80,但它们仍然索引为 100,但有间隙(例如,第 5 行丢失)。

我只想通过 winsorize 方法转换列“A”和“B”。为此,我必须将我的列转换为 np.array。

import scipy.stats 
df['A','B','C','D'] = #some values per each column 
ab_df = df['A','B'] 
X = scipy.stats.mstats.winsorize(ab_df.values, limits=0.01) 
new_ab_df = pd.DataFrame(X, columns = ['A','B']) 
df = pd.concat([df['C','D'], new_ab_df], axis=1, join='inner', join_axes=[df.index]) 

当我转换为 np.array,然后返回到 pd.DataFrame 时,len() 在 80 处是正确的,但我的索引已重置为 0->80。如何确保我的转换“A”和“B”列正确索引?我不认为我可以使用 apply(),它会保留索引顺序并简单地换出值而不是我的方法,它创建一个只有 2 列的 df 的转换副本,然后将它们连接到我的其余部分未转换的列。

请您参考如下方法:

您可以对原始数据框执行此操作。

从您的问题描述来看,您似乎混淆了行和列(即您首先说您的数据框有 12 列,然后说列数从 100 减少到 80)。

最好在您的问题中提供一个最小的数据示例。缺少这个,这里是一些基于我的假设的数据:

import numpy as np 
import scipy.stats 
import pandas as pd 
 
np.random.seed(0) 
df = pd.DataFrame(np.random.randn(7, 5), columns=list('ABCDE')) 
df.iat[1, 0] = np.nan 
df.iat[3, 1] = np.nan 
df.iat[5, 2] = np.nan 
 
>>> df 
          A         B         C         D         E 
0  1.764052  0.400157  0.978738  2.240893  1.867558 
1       NaN  0.950088 -0.151357 -0.103219  0.410599 
2  0.144044  1.454274  0.761038  0.121675  0.443863 
3  0.333674       NaN -0.205158  0.313068 -0.854096 
4 -2.552990  0.653619  0.864436 -0.742165  2.269755 
5 -1.454366  0.045759       NaN  1.532779  1.469359 
6  0.154947  0.378163 -0.887786 -1.980796 -0.347912 

我的假设是删除任何带有 NaN 的行,然后进行缩尾处理。

mask = df.notnull().all(axis=1), ['A', 'B'] 
df.loc[mask] = scipy.stats.mstats.winsorize(df.loc[mask].values, limits=0.4) 

我对 winsorize 函数应用了上限,以便在这个小数据集上的结果更加明显。

>>> df 
          A         B         C         D         E 
0  0.400157  0.400157  0.978738  2.240893  1.867558 
1       NaN  0.950088 -0.151357 -0.103219  0.410599 
2  0.378163  0.400157  0.761038  0.121675  0.443863 
3  0.333674       NaN -0.205158  0.313068 -0.854096 
4  0.378163  0.400157  0.864436 -0.742165  2.269755 
5 -1.454366  0.045759       NaN  1.532779  1.469359 
6  0.378163  0.378163 -0.887786 -1.980796 -0.347912