我的数据框如:
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(Y
和N
)。
我想知道熊猫是怎么做的。
答案 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