像Apache PIG包一样在python数据帧中展平条目

时间:2015-12-11 15:40:34

标签: python pandas apache-pig dataframe flatten

我的数据框如:

dem = {
   '{(dt-au=120000),(dt-au=120100)}': ['Y'],
   '{(dt-au=120000),(dt-au=120400)}': ['N'],
   '{(dt-au=120600),(dt-bi=130450)}': ['Y']
    };
df = pd.DataFrame(dem)
pd.melt(df)

                          variable value
0  {(dt-au=120000),(dt-au=120100)}     Y
1  {(dt-au=120000),(dt-au=120400)}     N
2  {(dt-au=120600),(dt-bi=130450)}     Y

我想生成另一个数据帧,其工作方式与PIG的FLATTEN包功能相同。此数据框看起来像:

       variable value
0  dt-au=120000     Y
1  dt-au=120100     Y
2  dt-au=120400     N
3  dt-au=120000     N
4  dt-au=120600     Y
5  dt-bi=130450     Y

注意:dt-au=120000出现两次不同的VALUES(YN)。

我想知道熊猫是怎么做的。

2 个答案:

答案 0 :(得分:2)

不确定是否有办法,因为您需要在dem

中拆分密钥字符串

所以,假设没有办法与熊猫一起做,这是一个前熊猫蛮力的方法。

import numpy as np
import pandas as pd

dem = {
   '{(dt-au=120000),(dt-au=120100)}': ['Y'],
   '{(dt-au=120000),(dt-au=120400)}': ['N'],
   '{(dt-au=120600),(dt-bi=130450)}': ['Y']
    };

col1 = []
col2 = []
for k,v in dem.items():
    keys = k.strip('{}').split(',')
    col1.extend(key.strip('()') for key in keys)
    col2.extend(v[0] for key in keys)

# not familiar enough with numpy, so you may be able to build this above
cols = np.array([col1, col2])
df = pd.DataFrame(cols) # may need to transpose this

输出(转置)

              0  1
0  dt-au=120000  Y
1  dt-au=120100  Y
2  dt-au=120000  N
3  dt-au=120400  N
4  dt-au=120600  Y
5  dt-bi=130450  Y

答案 1 :(得分:2)

您可以使用pandas的string功能:

import pandas as pd
import numpy as np
import io

dem = {
   '{(dt-au=120000),(dt-au=120100)}': ['Y'],
   '{(dt-au=120000),(dt-au=120400)}': ['N'],
   '{(dt-au=120600),(dt-bi=130450)}': ['Y']
    };
df = pd.DataFrame(dem)
df = pd.melt(df)

#cast to str, remove {}
df.variable  = df.variable.astype(str).str.strip('{}')

s = df['variable'].str.split(',').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'variable'
#remove ()
s  = s.str.strip('()')
print s
0    dt-au=120000
0    dt-au=120100
1    dt-au=120000
1    dt-au=120400
2    dt-au=120600
2    dt-bi=130450

df = df.drop( ['variable'], axis=1)
df = df.join(s).reset_index(drop=True)
print df

  value      variable
0     Y  dt-au=120000
1     Y  dt-au=120100
2     N  dt-au=120000
3     N  dt-au=120400
4     Y  dt-au=120600
5     Y  dt-bi=130450