Python 如何处理熊猫中不整洁的数据?

Python 如何处理熊猫中不整洁的数据?,python,pandas,dataframe,Python,Pandas,Dataframe,首先,我必须说,我对Python和Pandas相当陌生,但我希望将来更多地使用它们,因此我正在尝试使用它们。由于我的工作,我经常使用Excel,经常遇到数据(行)有其属性(列)的问题,但有时一些数据(行)可能有第三维度。下面是一个简单的Pandas dataframe示例来说明我的意思: df = pd.DataFrame(data={"obs":[["test1","test2"],"test1"], "result":[[101,103],200]},i

首先,我必须说,我对Python和Pandas相当陌生,但我希望将来更多地使用它们,因此我正在尝试使用它们。由于我的工作,我经常使用Excel,经常遇到数据(行)有其属性(列)的问题,但有时一些数据(行)可能有第三维度。下面是一个简单的Pandas dataframe示例来说明我的意思:

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

你一般是怎么处理的?我阅读了术语“整洁数据”,其中每个值都应该有自己的单元格。我应该为每个异常主题添加columns=>obs1、obs2、result1、result2还是添加行,比如:subs1\u 1、subs1\u 2属性(列)保持不变时,什么更有意义。多索引在这里有意义吗?我读了一些关于它的书,但我还不知道如何有效地使用它们。我一直在寻找那个主题,但没有任何东西能帮助我具体化。

在你的例子中,我认为主题不是一个好的索引。我建议使用数字增量索引或多索引。以后更容易处理。考虑一个例子:

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

让我们考虑一下,为每个唯一的子J计算平均结果。由于所有数据点都有自己的行,因此可以使用panda的函数:和

或者,如果要计算每个主题和对象的平均值

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导入数据后遇到列表中的数据点,我建议您编写一个函数,将1中的n行和它跨1个轴


希望有帮助

恐怕这是一个太宽泛的问题。常见的方法取决于实际情况。无论如何,请求外部资源在这里显然是离题的。非常确定这应该是三行,主题1重复两次。有很多关于熊猫如何帮助你到达那里的信息。这与“数据库规范化”密切相关,在“数据库规范化”中有很多相关文献。是的,我也认为它可能太宽泛了,但不知道如何写得更明确。我将删除外部资源问题,删除关于question@Arkady:谢谢你的回答。我将接受您的回答,因为只要列表是列值,您的语句就可以创建多行。
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