我有一个dataframe
来自外部源(csv文件)的多列(≈30),但其中有几列没有值或总是相同。因此,我会很快看到每列的value_counts
,我该怎么做?
例如
Id, temp, name
1 34, null, mark
2 22, null, mark
3 34, null, mark
会给我一个说明
的对象所以我知道temp是无关紧要的,名字不是很有趣(总是一样的)
答案 0 :(得分:12)
对于数据框,
df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3])
以下代码
for c in df.columns:
print "---- %s ---" % c
print df[c].value_counts()
将产生以下结果:
---- id ---
34 2
22 1
dtype: int64
---- temp ---
null 3
dtype: int64
---- name ---
mark 3
dtype: int64
答案 1 :(得分:7)
您可以使用df.apply
,它将使用提供的函数应用每个列,在这种情况下计算缺失值。这就是它的样子,
df.apply(lambda x: x.isnull().value_counts())
答案 2 :(得分:2)
执行此操作并返回一个很好的格式化系列的好方法是合并pandas.Series.value_counts
和pandas.DataFrame.stack
。
对于DataFrame
df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3])
您可以执行类似
的操作df.apply(lambda x: x.value_counts()).T.stack()
在此代码中,df.apply(lambda x: x.value_counts())
将value_counts
应用于每个列,并将其附加到生成的DataFrame
,因此最终会得到一个DataFrame
列,其中包含相同的列和一列每列中每个不同值的行(以及每个列中不显示的每个值的大量null
)。
之后,T
会转换DataFrame
(因此最终会得到DataFrame
,其索引等于列,列等于可能的值),stack
1}}将DataFrame
的列转换为MultiIndex的新级别,并且"删除"所有Null
值,使整个事件成为Series
。
结果是
id 22 1
34 2
temp null 3
name mark 3
dtype: float64
答案 3 :(得分:2)
代码如下
df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3])
result2 = df.apply(pd.value_counts)
result2
将产生:
答案 4 :(得分:1)
这类似于@Jagie的回复,但除此之外:
df = pd.DataFrame(
data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']],
columns=["id", 'temp', 'name'],
index=[1, 2, 3]
)
result2 = df.apply(pd.value_counts).fillna(0).astype(int)
答案 5 :(得分:0)
您可以替换:
fillna(0).astype(int)
到
fillna(0, downcast='infer')