如何处理熊猫中的非整理数据?

时间:2019-05-02 09:42:46

标签: python pandas dataframe

首先,我不得不说我是Python和Pandas的新手,但是我想在以后使用它们更多,因此我正在尝试它。由于我的工作,我经常使用Excel,并且经常遇到数据(行)具有其属性(列)的问题,但有时某些数据(行)可能具有第三维。这是一个简单的Pandas数据框示例,以显示我的意思:

df = pd.DataFrame(data={"obs":[["test1","test2"],"test1"],
                   "result":[[101,103],200]},index=["subj1","subj2"])
df

                  obs      result
subj1  [test1, test2]  [101, 103]
subj2           test1         200

您一般如何处理?我读了“整洁的数据”一词,其中每个值都应获得其自己的单元格。我应该为每个异常主题添加column => obs1,obs2,result1,result2还是添加行,例如:subj1_1,subj1_2,这对于属性(列)保持不变是更有意义的。在这里可以使多索引有意义吗?我读了一些,但是我还不了解如何有效地使用它们。我正在搜索该主题,但没有任何具体帮助。

1 个答案:

答案 0 :(得分:1)

在您的示例中,我认为subj不是一个好的索引。我会推荐使用数字增量索引或多索引。将来更容易处理。考虑一个例子:

df = pd.DataFrame(
    data={
        'subj':["subj1","subj1", "subj1", "subj1", "subj2", "subj2","subj2", "subj2", "subj3", "subj3"] ,
        "obs":["test1","test2","test2","test1",'test1','test1','test2','test2','test1','test2'],
        "result":[101,103,105,110, 203,159,193,285,400,543] 
    }
)
df
    subj    obs  result
0  subj1  test1     101
1  subj1  test2     103
2  subj1  test2     105
3  subj1  test1     110
4  subj2  test1     203
5  subj2  test1     159
6  subj2  test2     193
7  subj2  test2     285
8  subj3  test1     400
9  subj3  test2     543

让我们考虑您要为每个唯一主题计算平均值。由于所有数据点都有自己的行,因此可以使用熊猫函数:groupbymean

df.groupby('subj').mean()
       result
subj         
subj1  104.75
subj2  210.00
subj3  471.50

或者如果要计算每个subj和obj的均值

df.groupby(['subj','obs']).mean()
             result
subj  obs          
subj1 test1   105.5
      test2   104.0
subj2 test1   181.0
      test2   239.0
subj3 test1   400.0
      test2   543.0

如果从excel导入数据后在列表中遇到数据点-我将推荐编写一个函数,该函数将使n行从1到1,并apply跨1轴

希望有帮助!