我有一个大约52列的pandas数据框。我想获得每列的独特内容。 假设列名是col1,col2 ... col52。 要获得第1列的独特内容,我可以使用
df.col1.unique()
如果我必须对所有50列进行操作,这将是痛苦的。所以想做这样的事情,但不起作用。
for i in df.columns:
print 'df.'+i+'.unque()'
有什么建议吗?
答案 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]
将unique
与apply
:
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.Series
,np.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