将python数据框中的条目展平,如apache pig bag

yxyvkwin  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(372)

我有这样的Dataframe:

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

我想生成另一个Dataframe,它的工作方式与pig的flatten bag函数相同。此数据框看起来像:

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 以不同的值显示两次( Y 以及 N ).
我想知道Pandas是怎么做到的。

ubby3x7f

ubby3x7f1#

不确定是否有方法,因为您需要将密钥字符串拆分为 dem 所以,假设没有办法用Pandas来做这件事,这里有一个前Pandas暴力的方法。

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
s5a0g9ez

s5a0g9ez2#

您可以使用Pandas的字符串函数:

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

相关问题