pandas:规范化DataFrame

max*_*max 7 python database-normalization pandas

我在平面文件中输入数据.我想通过将它们分成表来规范化这些数据.我可以巧妙地做到这一点pandas- 也就是说,通过将扁平数据读入DataFrame实例,然后应用一些函数来获得结果DataFrame实例?

例:

数据以CSV文件的形式提供给我,如下所示:

ItemId   ClientId   PriceQuoted  ItemDescription
1        1          10           scroll of Sneak
1        2          12           scroll of Sneak
1        3          13           scroll of Sneak
2        2          2500         scroll of Invisible
2        4          2200         scroll of Invisible
Run Code Online (Sandbox Code Playgroud)

我想创建两个DataFrame:

ItemId   ItemDescription
1        scroll of Sneak
2        scroll of Invisibile
Run Code Online (Sandbox Code Playgroud)

ItemId   ClientId   PriceQuoted
1        1          10
1        2          12
1        3          13
2        2          2500
2        4          2200
Run Code Online (Sandbox Code Playgroud)

如果pandas对于最简单的情况只有一个很好的解决方案(规范化导致2个表具有多对一关系 - 就像上面的例子一样),它可能足以满足我当前的需求.但是,我将来可能需要一个更通用的解决方案.

Wou*_*ire 9

In [30]: df = pandas.read_csv('foo1.csv', sep='[\s]{2,}')

In [30]: df
Out[30]:
   ItemId  ClientId  PriceQuoted      ItemDescription
0       1         1           10      scroll of Sneak
1       1         2           12      scroll of Sneak
2       1         3           13      scroll of Sneak
3       2         2         2500  scroll of Invisible
4       2         4         2200  scroll of Invisible

In [31]: df1 = df[['ItemId', 'ItemDescription']].drop_duplicates().set_index('ItemId')

In [32]: df1
Out[32]:
            ItemDescription
ItemId
1           scroll of Sneak
2       scroll of Invisible

In [33]: df2 = df[['ItemId', 'ClientId', 'PriceQuoted']]

In [34]: df2
Out[34]:
   ItemId  ClientId  PriceQuoted
0       1         1           10
1       1         2           12
2       1         3           13
3       2         2         2500
4       2         4         2200
Run Code Online (Sandbox Code Playgroud)