for in loop从pandas框架中打印唯一值

时间:2017-02-10 05:57:44

标签: python pandas for-loop

我有一个大约52列的pandas数据框。我想获得每列的独特内容。 假设列名是col1,col2 ... col52。 要获得第1列的独特内容,我可以使用

df.col1.unique()

如果我必须对所有50列进行操作,这将是痛苦的。所以想做这样的事情,但不起作用。

for i in df.columns:
    print 'df.'+i+'.unque()'

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您只想要print最简单的值是:

for col in df:
    print (col, df[col].unique())

A [1 2 3]
B [4 6]
C [9]
D [1 5]
E [5 3]
F [7 4]

uniqueapply

一起使用
df1 = df.apply(lambda x: pd.Series(x.unique()))

样品:

df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,4,6],
                   'C':[9,9,9],
                   'D':[1,1,5],
                   'E':[5,3,3],
                   'F':[7,4,7]})

print (df)
   A  B  C  D  E  F
0  1  4  9  1  5  7
1  2  4  9  1  3  4
2  3  6  9  5  3  7

df1 = df.apply(lambda x: pd.Series(x.unique()))
print (df1)
   A    B    C    D    E    F
0  1  4.0  9.0  1.0  5.0  7.0
1  2  6.0  NaN  5.0  3.0  4.0
2  3  NaN  NaN  NaN  NaN  NaN

另一种解决方案,但drop_duplicates的输出略有不同:

df1 = df.apply(lambda x: x.drop_duplicates())
print (df1)
   A    B    C    D    E    F
0  1  4.0  9.0  1.0  5.0  7.0
1  2  NaN  NaN  NaN  3.0  4.0
2  3  6.0  NaN  5.0  NaN  NaN

答案 1 :(得分:2)

考虑数据框df

df = pd.DataFrame(
    np.random.randint(1, 100, (10, 5)),
    columns=['col{}'.format(i) for i in range(1, 6)]
)

print(df)

   col1  col2  col3  col4  col5
0     4    58    89    15    75
1    66    89    38     6    11
2    85    48    32    60    97
3    28     3    27    12    66
4    88    60    99    11    19
5    30    71     2    53    10
6    38    23    29     2    22
7    50     7    68    87     8
8    25    50     1    10    20
9    58    94    67    54     1

选项1
使用pd.Seriesnp.unique和列表理解

的组合
pd.Series([np.unique(x) for _, x in df.iteritems()], df.columns)

col1    [4, 66, 85, 28, 88, 30, 38, 50, 25, 58]
col2     [58, 89, 48, 3, 60, 71, 23, 7, 50, 94]
col3     [89, 38, 32, 27, 99, 2, 29, 68, 1, 67]
col4     [15, 6, 60, 12, 11, 53, 2, 87, 10, 54]
col5     [75, 11, 97, 66, 19, 10, 22, 8, 20, 1]
dtype: object

选项2
使用groupby + np.unique

df.groupby(axis=1, level=0).apply(np.unique)

col1    [4, 25, 28, 30, 38, 50, 58, 66, 85, 88]
col2     [3, 7, 23, 48, 50, 58, 60, 71, 89, 94]
col3     [1, 2, 27, 29, 32, 38, 67, 68, 89, 99]
col4     [2, 6, 10, 11, 12, 15, 53, 54, 60, 87]
col5     [1, 8, 10, 11, 19, 20, 22, 66, 75, 97]
dtype: object