使用python将多个表解析为一个csv

时间:2019-01-08 09:04:06

标签: python-3.x pandas pivot-table

我有一个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万行

我对提示很满意

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
masterIddf1中的

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不匹配的事实。