首页 > 解决方案 > Pandas 数据框从窄到宽,数据透视表没有聚合

问题描述

我有一个包含数据集的熊猫数据框iris。我想将此数据框子集化为仅包含sepal_lengthand 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'),但也不是这样。

我在这里想念什么?

标签: pythonpandas

解决方案


您可以grouby.cumcountspeciescol 和 set index 上使用 IIUC,然后使用它pivot来代替pivot_table不需要aggfunc。

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

推荐阅读