我有下面的dataframe,并希望以一种方式将列Imprv_Attribute
转换为每个键的单个列,并且值应为Imprv_Attr_Desc
。我还需要Imprv_Attr_Units
信息,对于每个新创建的列,例如Bathrooms
的Imprv_Attr_Units
应该有自己的名为Bathrooms_Imprv_Attr_Units
的列
| | Parcel | Imprv_Attribute | Imprv_Attr_Desc | Imprv_Attr_Units |
| --- | ------------- | --------------- | ----------------- | ---------------- |
| 0 | 00002-000-000 | Bathrooms | 2.0-Baths | 1.0 |
| 1 | 00002-000-000 | Bedrooms | 2-2 BEDROOMS | 1.0 |
| 2 | 00002-000-000 | Exterior Wall | 13-PRE-FAB PANEL | 100.0 |
| 3 | 00002-000-000 | Floor Cov | 08-SHEET VINYL | 20.0 |
| 4 | 00002-000-000 | Floor Cov | 14-CARPET | 80.0 |
| 5 | 00011-000-000 | Bathrooms | 3.0-Baths | 1.0 |
| 6 | 00011-000-000 | Bedrooms | 3-3 BEDROOMS | 1.0 |
| 7 | 00011-000-000 | Exterior Wall | 15-CONCRETE BLOCK | 60.0 |
| 8 | 00011-000-000 | Exterior Wall | 20-FACE BRICK | 40.0 |
| 9 | 00011-000-000 | Floor Cov | 14-CARPET | 100.0 |
我的最终结果应该如下所示:
| Parcel | Bathrooms | Bathrooms_Imprv_Attr_Units | Bedrooms | Bedrooms_Imprv_Attr_Units | Exterior Wall | Exterior Wall_Imprv_Attr_Units | Floor Cov | Floor Cov_Imprv_Attr_Unit |
| ------------- | --------- | -------------------------- | ------------ | ------------------------- | ----------------- | ------------------------------ | -------------- | ------------------------- |
| 00002-000-000 | 2.0-Baths | 1.0 | 2-2 BEDROOMS | 1.0 | 13-PRE-FAB PANEL | 100.0 | 08-SHEET VINYL | 20.0 |
| 00002-000-000 | | | | | | | 14-CARPET | 80.0 |
| 00011-000-000 | 3.0-Baths | 1.0 | 3-3 BEDROOMS | 1.0 | 15-CONCRETE BLOCK | 60.0 | 14-CARPET | 100.0 |
| 00011-000-000 | | | | | 20-FACE BRICK | 40.0 | | |
到目前为止,我have tried this:
from io import StringIO
import pandas as pd
data = StringIO(
"""
Parcel;Imprv_Attribute;Imprv_Attr_Desc;Imprv_Attr_Units
00002-000-000;Bathrooms;2.0-Baths;1.0
00002-000-000;Bedrooms; 2-2 BEDROOMS;1.0
00002-000-000;Exterior Wall;13-PRE-FAB PANEL;100.0
00002-000-000;Floor Cov;08-SHEET VINYL; 20.0
00002-000-000;Floor Cov;14-CARPET;80.0
00011-000-000;Bathrooms;3.0-Baths;1.0
00011-000-000;Bedrooms; 3-3 BEDROOMS;1.0
00011-000-000;Exterior Wall;15-CONCRETE BLOCK;60.0
00011-000-000;Exterior Wall;20-FACE BRICK;40.0
00011-000-000;Floor Cov;14-CARPET;100.0
"""
)
df = pd.read_csv(data, sep=";")
df = df.pivot_table(values="Imprv_Attr_Desc", index="Parcel", columns="Imprv_Attribute", aggfunc="first")
print(df)
这导致了这个数据帧,由于聚合函数first
,我丢失了关于Floor Cov
和Exterior Wall
的信息
| Parcel | Bathrooms | Bedrooms | Exterior Wall | Floor Cov |
| ------------- | --------- | ------------ | ----------------- | -------------- |
| 00002-000-000 | 2.0-Baths | 2-2 BEDROOMS | 13-PRE-FAB PANEL | 08-SHEET VINYL |
| 00011-000-000 | 3.0-Baths | 3-3 BEDROOMS | 15-CONCRETE BLOCK | 14-CARPET |
我也试过this answer
df = df.pivot_table(index=[df.index, "Parcel"], columns="Imprv_Attribute", values="Imprv_Attr_Desc")
print(df)
结果是pandas.core.base.DataError: No numeric types to aggregate
。我也尝试过groupby,但这也没有达到我想要的效果:
df_group = df.groupby(["Parcel"])
for key, item in df_group:
df = df_group.get_group(key)
df = df.pivot(columns="Imprv_Attribute", values="Imprv_Attr_Desc")
print(df, "\n\n")
<class 'pandas.core.frame.DataFrame'>
Imprv_Attribute Bathrooms Bedrooms Exterior Wall Floor Cov HC&V HVAC Heat System Interior Wall Num Res Units Roof Type Roofing
0 2.0-Baths NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN 2-2 BEDROOMS NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN 13-PRE-FAB PANEL NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN 08-SHEET VINYL NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN 14-CARPET NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN 04-FORCED AIR NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN 04-ELECTRIC NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN 01-NONE NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN 04-PANEL NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN Num Res Units NaN NaN
10 NaN NaN NaN NaN NaN NaN NaN NaN NaN 03-GABLE/HIP NaN
11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 03-ASPHALT
<class 'pandas.core.frame.DataFrame'>
Imprv_Attribute Bathrooms Bedrooms Exterior Wall Floor Cov HC&V HVAC Heat System Interior Wall Num Res Units Roof Type Roofing
12 3.0-Baths NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
13 NaN 3-3 BEDROOMS NaN NaN NaN NaN NaN NaN NaN NaN NaN
14 NaN NaN 15-CONCRETE BLOCK NaN NaN NaN NaN NaN NaN NaN NaN
15 NaN NaN 20-FACE BRICK NaN NaN NaN NaN NaN NaN NaN NaN
16 NaN NaN NaN 14-CARPET NaN NaN NaN NaN NaN NaN NaN
17 NaN NaN NaN NaN 04-FORCED AIR NaN NaN NaN NaN NaN NaN
18 NaN NaN NaN NaN NaN NaN 04-ELECTRIC NaN NaN NaN NaN
19 NaN NaN NaN NaN NaN 03-CENTRAL NaN NaN NaN NaN NaN
20 NaN NaN NaN NaN NaN NaN NaN 05-DRYWALL NaN NaN NaN
根据this answer,解决方案可能是pd.DataFrame.groupby
和pd.DataFrame.unstack
的组合,但目前我不知道如何在我的案例中应用这些
如果有人对如何帮助我有好的想法,我将不胜感激
这可以通过
pivot_table
(similar to question 10 in the how to pivot canonical)和一些额外的步骤来完成首先,您需要创建一个
cumcount
级别,以便每个'Parcel'
中重复的Imprv_Attribute'
值都有自己的标签,可以用来指定索引。然后聚合多个值列(使用first
)。我们将在列上留下一个多索引,通过在一个简单的列表中强加您的命名约定来折叠这些列。最后,我们可以对列进行排序,并删除我们创建的索引的cumcount
级别相关问题 更多 >
编程相关推荐