展平 python 数据框中的条目,如 Apache PIG 包

Posted

技术标签:

【中文标题】展平 python 数据框中的条目,如 Apache PIG 包【英文标题】:flatten entries in python dataframe like Apache PIG bag 【发布时间】:2016-03-17 14:03:23 【问题描述】:

我有这样的数据框:

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 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 以不同的 VALUES 出现两次(YN)。

我想知道如何在 pandas 中做到这一点。

【问题讨论】:

【参考方案1】:

不确定是否有办法,因为您需要拆分 dem 中的密钥字符串

所以,假设没有办法使用 Pandas 来实现,这里有一个 pre-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

【讨论】:

谢谢!我必须为整个事情使用熊猫。在从另一个数据帧进行一些处理后,我得到了“dem”,所以我尽量不破坏结构。 欢迎。我在“破坏”它,因为我根本没有改变 dem 的值。我只是以不同的方式初始化了 numpy 数组以加载到数据帧中。【参考方案2】:

你可以使用pandas的@​​987654321@函数:

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

【讨论】:

谢谢!!我在想类似的事情,但想寻求更清洁的解决方案。但这行得通!

以上是关于展平 python 数据框中的条目,如 Apache PIG 包的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地展平Spark数据框中的特征?

将任意长度的字典项展平为 Python 中的路径列表

如何在熊猫数据框中展平数组

在熊猫数据框中展平嵌套的 Json

如何为列中的每个唯一值获取数据框中的项目数[重复]

如何使用 python 有选择地删除 x 行以在数据框中重复条目?