这是我自己学习Python三天后的第一个SO问题,请保持宽容。
我已经连接了四个数据帧:
frames = [dfLocationID, dfDimensions, dfCategories, dfTags]
result = pd.concat(frames,
ignore_index=True,
sort=False)
要获取此信息:
Location ID Dimensions Categories Tags
0 1000.0 NaN NaN NaN
1 NaN 3,000 sq ft NaN NaN
2 NaN NaN * In the Zone NaN
3 NaN NaN Apartment NaN
4 NaN NaN Loft NaN
5 NaN NaN NaN Bohemian
6 NaN NaN NaN Colorful
7 NaN NaN NaN Eclectic Quirky
8 NaN NaN NaN Kitchen
9 NaN NaN NaN Living Room
10 NaN NaN NaN Piano
11 NaN NaN NaN Wood Floor
我想实现这一目标:
Location ID Dimensions Item Data
0 1000.0 3,000 sq ft Categories * In the Zone
1 1000.0 3,000 sq ft Categories Apartment
2 1000.0 3,000 sq ft Categories Loft
3 1000.0 3,000 sq ft Tags Bohemian
4 1000.0 3,000 sq ft Tags Colorful
5 1000.0 3,000 sq ft Tags Eclectic Quirky
6 1000.0 3,000 sq ft Tags Kitchen
7 1000.0 3,000 sq ft Tags Living Room
8 1000.0 3,000 sq ft Tags Piano
9 1000.0 3,000 sq ft Tags Wood Floor
然后我尝试了这个:
dfTemp = ((dfLocationID.join(dfDimensions, how='outer')).join(dfCategories, how='outer')).join(dfTags, how='outer')
要获取此信息:
Location ID Dimensions Categories Tags
0 1000.0 3,000 sq ft * In the Zone Bohemian
1 NaN NaN Apartment Colorful
2 NaN NaN Loft Eclectic Quirky
3 NaN NaN NaN Kitchen
4 NaN NaN NaN Living Room
5 NaN NaN NaN Piano
6 NaN NaN NaN Wood Floor
现在我正在尝试将最后两列转换为行:
dfFinal = dfTemp.melt(id_vars=["Location ID", "Dimensions"],
var_name="Item",
value_name="Data")
但是我明白了:
Location ID Dimensions Item Data
0 1000.0 3,000 sq ft Categories * In the Zone
1 NaN NaN Categories Apartment
2 NaN NaN Categories Loft
3 NaN NaN Categories NaN
4 NaN NaN Categories NaN
5 NaN NaN Categories NaN
6 NaN NaN Categories NaN
7 1000.0 3,000 sq ft Tags Bohemian
8 NaN NaN Tags Colorful
9 NaN NaN Tags Eclectic Quirky
10 NaN NaN Tags Kitchen
11 NaN NaN Tags Living Room
12 NaN NaN Tags Piano
13 NaN NaN Tags Wood Floor
关于如何清理数据的任何想法?另外,我将不得不遍历不同的位置ID,并且类别和标签中的值的数量将不是恒定的。
谢谢。
答案 0 :(得分:0)
首先,我将context.tblWorkOrder.AsNoTracking().Include(r => r.CloseBy).Include(r => r.EnteredBy)
...
转换为NaN
,因为它们更易于处理:
None
然后,您希望整个第一列和第二列具有相同的值(我不知道您在何处进行假设):
df = df.where((pd.notnull(df)), None)
然后,您可以按原样运行melt函数。现在,您只需要过滤掉“项目”或“数据”列中所有df['Location ID'] = df['Location ID'].iloc[0]
df['Dimensions'] = df['Dimensions'].iloc[1]
的行:
None
然后,输出如您所愿:
df = df[~(df["Item"].isnull() | df["Data"].isnull())]
如果需要在其他位置执行此操作,请将此过程打包到函数Location ID Dimensions Item Data
2 1000.0 3000 sq ft Categories * In the Zone
3 1000.0 3000 sq ft Categories Apartment
4 1000.0 3000 sq ft Categories Loft
17 1000.0 3000 sq ft Tags Bohemian
18 1000.0 3000 sq ft Tags Colorful
19 1000.0 3000 sq ft Tags Eclectic Quirky
20 1000.0 3000 sq ft Tags Kitchen
21 1000.0 3000 sq ft Tags Living Room
22 1000.0 3000 sq ft Tags Piano
23 1000.0 3000 sq ft Tags Wood Floor
中,并使用transform
:
groupby