将具有单个值列表的pandas列转换为行

时间:2018-11-01 16:24:14

标签: python pandas numpy

我有以下数据框:

  symbol           PSAR
0   AAPL  [nan,100,200]
1   PYPL  [nan,300,400]
2    SPY  [nan,500,600]

我正在尝试将PSAR列表值转换为如下行:

symbol   PSAR

AAPL     nan
AAPL     100
AAPL     200
PYPL     nan
PYPL     300
...      ...
SPY      600

我一直在尝试通过遵循此帖子中的答案来解决它(一个主要区别是该帖子具有列表列表),但无法到达那里。 How to convert column with list of values into rows in Pandas DataFrame

df['PSAR'].stack().reset_index(level=1, drop=True).to_frame('PSAR')
.join(df[['symbol']], how='left')

2 个答案:

答案 0 :(得分:1)

这不是一个聪明的人,但是可以做到这一点:

list_of_lists = []
df_as_dict = dict(df.values)
for key,values in df_as_dict.items():
    list_of_lists+=[[key,value] for value in values]
pd.DataFrame(list_of_lists)

返回:

    0      1
0   AAPL    NaN
1   AAPL    100.0
2   AAPL    200.0
3   PYPL    NaN
4   PYPL    300.0
5   PYPL    400.0
6   SPY     NaN
7   SPY    500.0
8   SPY    600.0

答案 1 :(得分:1)

熊猫> = 0.25:

df1 = pd.DataFrame({'symbol':['AAPL', 'PYPL', 'SPY'],
               'PSAR':[[None,100,200], [None,300,400], [None,500,600]]})
print(df1)

symbol  PSAR
0   AAPL    [None, 100, 200]
1   PYPL    [None, 300, 400]
2   SPY [None, 500, 600]

df1.explode('PSAR')

    symbol  PSAR
0   AAPL    None
0   AAPL    100
0   AAPL    200
1   PYPL    None
1   PYPL    300
1   PYPL    400
2   SPY     None
2   SPY     500
2   SPY     600