使用value.counts()从for循环创建一个新的数据框

时间:2020-08-18 10:51:56

标签: python dataframe loops

我有一个包含51列的数据帧(df3),并通过for循环设法显示每个功能中最常见的值。

for col in df3.columns:
    print('-' * 40 + col + '-' * 40 , end=' - ')
    display(df3[col].value_counts().head(10))

enter image description here

现在,我想用循环的结果创建一个名为df4的新数据框。这是df3所有列中的10个最频繁的值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

我使用来获取价值

 df4 = df3.apply(lambda col: col.value_counts().head(10).index)

我使用for而不是apply循环。

因为.value_counts()创建了Series,它使用原始的IDs作为索引,所以我得到了.index


最小的工作示例-因为我的值较少,所以我使用head(2)

import pandas as pd

data = {
    'A': [1,2,3,3,4,5,6,6,6], 
    'B': [4,5,6,4,2,3,4,8,8], 
    'C': [7,8,9,7,1,1,1,2,2]
} # columns

df = pd.DataFrame(data)

df2 = df.apply(lambda col: col.value_counts().head(2).index)

print(df2)
      

结果

   A  B  C
0  6  4  1
1  3  8  7

编辑:

如果列中的结果少于10个,则可以转换为具有10 x {NaN的列表展开列表,然后将其裁剪为[:10]

.head(10).index.tolist() + [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN])[:10])

最小的工作示例

import pandas as pd
import numpy as np

data = {
    'A': [1,2,3,3,4,5,6,6,6], 
    'B': [4,5,6,4,2,3,4,8,8], 
    'C': [7,8,9,7,1,1,1,2,2]
} # columns

df = pd.DataFrame(data)

NAN10 = [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]

df2 = df.apply(lambda col: (col.value_counts().head(10).index.tolist() + NAN10)[:10])

print(df2)
  

结果

     A    B    C
0  6.0  4.0  1.0
1  3.0  8.0  7.0
2  5.0  6.0  2.0
3  4.0  5.0  9.0
4  2.0  3.0  8.0
5  1.0  2.0  NaN
6  NaN  NaN  NaN
7  NaN  NaN  NaN
8  NaN  NaN  NaN
9  NaN  NaN  NaN

您也可以尝试转换为Series,它可能会在缺少的地方添加NaN,但会跳过仅包含NaN的行

import pandas as pd
import numpy as np

data = {
    'A': [1,2,3,3,4,5,6,6,6], 
    'B': [4,5,6,4,2,3,4,8,8], 
    'C': [7,8,9,7,1,1,1,2,2]
} # columns

df = pd.DataFrame(data)

df3 = df.apply(lambda col: pd.Series(col.value_counts().head(10).index))

print(df3)
  

结果

   A  B    C
0  6  4  1.0
1  3  8  7.0
2  5  6  2.0
3  4  5  9.0
4  2  3  8.0
5  1  2  NaN