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
添加回答
舉報