从2D数据帧制作单列数据帧

时间:2018-11-22 09:52:30

标签: python pandas numpy

我有一个数据框,其形状为(7500,2000),其值从0到7。

    0   1   2   3   4   5   6   7   8   9   ... 1990    1991    1992    1993    1994    1995    1996    1997    1998    1999
0   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

我想从中创建一个数据列,其中有一列。

该值是一个最大计数为1-7的数字,因为它们大多数为零,因此,如果逻辑如下,将不胜感激。

  1. 仅在零计数= 95%的位置填充零
  2. 使用最大1-7的最大计数填充,其中零小于总数的95%。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作。使用以下示例数据框:

print(df)

  1    2    3    4    5    6    7    8    9   10
0                                                  
0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
1  0.0  1.0  1.0  1.0  0.0  1.0  2.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
3  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0

def fun(x):
    is_zero = x.quantile(q=0.95) == 0
    if is_zero:
        return x
    else:
        most_common = x[x!=0].value_counts().index[0]
        return np.repeat(most_common, len(x))

df.apply(lambda x: fun(x), axis = 1)

    1    2    3    4    5    6    7    8    9   10
0                                                  
0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
1  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
2  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
3  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0

答案 1 :(得分:1)

基于亚历山大的出色回答,我不确定他是否正确解释了您的问题。

如果您需要构建一个包含单个列的新数据框(或要将该列附加到现有数据框),请提供以下解决方案:

df = original_dataframe

def fun(x):
    is_zero = x.quantile(q=0.95) == 0
    if is_zero:
        return 0
    else:
        number = x[x != 0].value_counts()
        return number[number.index[0]]

# to add a new column to the existing dataset
df["new_column"] = df.apply(lambda x: fun(x), axis = 1) 

# to build a new dataframe
new_dataframe = pd.DataFrame(df.apply(lambda x: fun(x), axis = 1))