2 回答

TA贡献1854条经验 获得超8个赞
这是一种让您非常接近所需 CSV 输出的方法:
# create sample data
from io import StringIO
import pandas as pd
data = '''col_a, col_b, col_c
10, 20, 30
10, 21, 31
10, 21, 33
11, 22, 33
'''
df = pd.read_csv(StringIO(data), sep=', ', engine='python')
print(df)
col_a col_b col_c
0 10 20 30
1 10 21 31
2 10 21 33
3 11 22 33
其次,用于unstack()重新塑造数据框(即,列标签变为行标签)。level=0并通过(原始列标签)计算值的数量:
df = df.unstack().groupby(level=0).value_counts()
col_a 10 3
11 1
col_b 21 2
20 1
22 1
col_c 33 2
30 1
31 1
dtype: int64
最后,重置索引(行标签),使列标签有意义,然后排序:
df = (df.reset_index()
.rename(columns={'level_0': 'orig_col', 'level_1': 'orig_value', 0: 'num_occur'})
.sort_values('orig_value')
.sort_values('num_occur', ascending=False)
.sort_values('orig_col')
)
print(df)
orig_col orig_value num_occur
0 col_a 10 3
1 col_a 11 1
2 col_b 21 2
3 col_b 20 1
4 col_b 22 1
5 col_c 33 2
6 col_c 30 1
7 col_c 31 1
您可以将最新版本的数据框写入 Excel。

TA贡献1966条经验 获得超4个赞
我假设一列中的值是单一类型,并且您可以在一列中包含字符串,在第二列中包含整数,等等。(如果这不正确,您可以将所有内容都转换为字符串并使用第一个响应).
# create test data -- different type for each column
from io import StringIO
import pandas as pd
data2 = '''col_a, col_b, col_c
10, 'x', '2019-12-29'
10, 'y', '2019-12-29'
10, 'z', '2019-12-30'
11, 'z', '2019-12-31'
'''
df2 = pd.read_csv(StringIO(data2), sep=', ', engine='python', parse_dates=['col_c'])
现在在每一列上使用value_counts(),并连接成一个宽表:
results = list()
for col in df2.columns:
s = (df2[col]
.value_counts()
.reset_index()
.rename(columns = {'index': 'value', col: 'count'}))
s.columns = pd.MultiIndex.from_product([[col], s.columns])
results.append(s)
results = pd.concat(results, axis=1)
print(results)
col_a col_b col_c
value count value count value count
0 10.0 3.0 'z' 2 2019-12-29 2
1 11.0 1.0 'y' 1 2019-12-31 1
2 NaN NaN 'x' 1 2019-12-30 1
添加回答
举报