我有一个csv文件,其中所有表都位于下面。所有表都有一个MasterId,可以用来链接它们。目前,我尝试使用pandas.pivot_table
这是csv现在的样子
masterId featureName featureValue
1 bar fooo
2 bar x
3 bar y
4 bar z
masterId featureName featureValue
1 zzz m
2 zzz p
3 zzz q
4 zzz r
.
.
.
我希望它看起来如何
masterId bar zzz
1 foo m
2 x p
3 y q
4 z r
这是我要转置的代码
transposedTables = pd.pivot_table(
untransposedDataFrame,
index=["masterId"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
transposedTables.to_csv('./transposed_export_07012019.csv')
但是尽管有一个条目,但某些值仍然为空
masterId bar zzz
1 m
2 p
3 y
4
您知道为什么字段为空吗?它有大约50个表,每20k行和19mb。在数据透视表之后,应该有50列,每行约2万行
我对提示很满意
答案 0 :(得分:0)
如果您可以访问每个表并将其旋转,则只需合并即可。希望这是您想要的:
df1 = pd.DataFrame(data = {'masterId': [1,2,3,4],
'featureName': ['bar','bar','bar','bar'],
'featureValue': ['foo','x','y','z']})
df2 = pd.DataFrame(data = {'masterId': [1,2,3,4],
'featureName': ['zzz','zzz','zzz','zzz'],
'featureValue': ['m','p','q','r']})
transposedTable1 = pd.pivot_table(
df1,
index=["masterId"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
transposedTable2 = pd.pivot_table(
df2,
index=["masterId"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
df = transposedTable1.merge(transposedTable2, on='masterId', how='inner')
这会产生预期的df,但具有不同的列名,如果您注意到df是MultiIndex,则易于处理和更改(请使用df.columns
进行验证)
答案 1 :(得分:0)
我猜这是因为masterId
索引列中的某些索引不匹配。首先,让我们看看它何时可以正常工作:
untransposedDataFrame = pd.concat((df1, df2)) # df1, df2 from your example
untransposedDataFrame
Out:
featureName featureValue
masterId
1 zzz foo
2 zzz x
3 zzz y
4 zzz z
1 bar m
2 bar p
3 bar q
4 bar r
masterId
和df1
中的 df2
匹配,因此可以正常运行:
pd.pivot_table(
untransposedDataFrame,
index=["masterId"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
Out:
sum
featureValue
featureName bar zzz
masterId
1 m foo
2 p x
3 q y
4 r z
我猜,实际上在您的情况下,untransposedDataFrame中的索引不匹配:
untransposedDataFrame
Out:
featureName featureValue
masterId
1 zzz foo
2 zzz x
3 zzz y
4 zzz z
5 bar m
6 bar p
7 bar q
8 bar r
修改DataFrame:
pd.pivot_table(
untransposedDataFrame,
index=["masterId"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
Out:
sum
featureValue
featureName bar zzz
masterId
1 NaN foo
2 NaN x
3 NaN y
4 NaN z
5 m NaN
6 p NaN
7 q NaN
8 r NaN
解决方案0
如果遗漏了值,则这是一项功能-masterId
在两个表中不匹配,因此请记住它和数据。
解决方案1(错误)
忽略masterId
(可能不适用于大多数情况)。重置指标:
df1_reset = df1.reset_index()
df2_reset = df2.reset_index()
df1_reset
Out:
masterId featureName featureValue
0 1 zzz foo
1 2 zzz x
2 3 zzz y
3 4 zzz z
untransposedDataFrameReset = pd.concat((df1_reset, df2_reset))
untransposedDataFrameReset.index.name = "newIndex"
现在看起来像:
untransposedDataFrameReset
Out:
masterId featureName featureValue
newIndex
0 1 zzz foo
1 2 zzz x
2 3 zzz y
3 4 zzz z
0 5 bar m
1 6 bar p
2 7 bar q
3 8 bar r
因此,它可以换位,但是masterId
刚刚丢失:
untransposedDataFrame,
index=["newIndex"],
columns=["featureName"],
values=["featureValue"],
aggfunc=[np.sum],
dropna=True)
Out:
sum
featureValue
featureName bar zzz
newIndex
0 m foo
1 p x
2 q y
3 r z
解决方案2(看起来更好)
执行与解决方案1中相同的“重新索引”步骤,您将获得:
unstackedDataFrameReset
Out:
masterId featureName featureValue
newIndex
0 1 zzz foo
1 2 zzz x
2 3 zzz y
3 4 zzz z
0 5 bar m
1 6 bar p
2 7 bar q
3 8 bar r
这很重要-newIndex
值应与您计划聚合的行匹配,并且masterId
应该是一列。创建一个featureName
新的索引级别,并通过它取消堆栈DataFrame:
untransposedDataFrameReset.set_index("featureName", append=True).unstack()
Out[149]:
masterId featureValue
featureName bar zzz bar zzz
newIndex
0 5 1 m foo
1 6 2 p x
2 7 3 q y
3 8 4 r z
因此,您不会丢失masterId
索引,也不会获取NaN值。但是那种情况下,您会忽略某些ID不匹配的事实。