python - Pandas 数据框从窄到宽,数据透视表没有聚合
问题描述
我有一个包含数据集的熊猫数据框iris
。我想将此数据框子集化为仅包含sepal_length
and species
,然后对其进行整形,以使列是该物种的唯一值,species
而这些值是该物种的值。
# load data into a dataframe
df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
head(df)
+----+---------------+--------------+---------------+--------------+---------+
| | sepal_length | sepal_width | petal_length | petal_width | species |
+----+---------------+--------------+---------------+--------------+---------+
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
+----+---------------+--------------+---------------+--------------+---------+
我可以做到这一点是我从熊猫中取出数据,因为使用字典来重塑数据,但我不知道如何在熊猫中做到这一点。
data = df.to_dict('records')
e = {}
for line in data:
e[line['species']] = []
for line in data:
e[line['species']].append(line['sepal_length'])
new = pd.DataFrame(e)
这就是我想要结束的:
+----+---------+-------------+-----------+
| | setosa | versicolor | virginica |
+----+---------+-------------+-----------+
| 0 | 5.1 | 7.0 | 6.3 |
| 1 | 4.9 | 6.4 | 5.8 |
| 2 | 4.7 | 6.9 | 7.1 |
| 3 | 4.6 | 5.5 | 6.3 |
| 4 | 5.0 | 6.5 | 6.5 |
+----+---------+-------------+-----------+
我试过使用pd.crosstab(df['sepal_length'], df['species'])
,但这并没有让我得到我想要的。我也尝试过使用df.pivot_table('sepal_length', columns='species')
,但也不是这样。
我在这里想念什么?
解决方案
您可以grouby.cumcount
在species
col 和 set index 上使用 IIUC,然后使用它pivot
来代替pivot_table
不需要agg
func。
df1 = df.set_index(df.groupby('species').cumcount())
df1 = df1.pivot(columns='species', values='sepal_length').rename_axis(None,axis=1)
print (df1)
setosa versicolor virginica
0 5.1 7.0 6.3
1 4.9 6.4 5.8
2 4.7 6.9 7.1
3 4.6 5.5 6.3
4 5.0 6.5 6.5