如何在不丢失索引的情况下转换 pandas 中的数据框?
How can I transform a dataframe in pandas without losing my index?
我需要对 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 的行,然后进行 winsorize。
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
只需将新值分配给现有列即可。
X = scipy.stats.mstats.winsorize(ab_df.values, limits=0.01)
df.loc[:, ['A', 'B']] = X
我需要对 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 的行,然后进行 winsorize。
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
只需将新值分配给现有列即可。
X = scipy.stats.mstats.winsorize(ab_df.values, limits=0.01)
df.loc[:, ['A', 'B']] = X