展平 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 出现两次(Y
和 N
)。
我想知道如何在 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 包的主要内容,如果未能解决你的问题,请参考以下文章