将DataFrame或一系列列表转换为一个堆叠的DataFrame(或系列)

时间:2017-11-07 12:07:49

标签: python list pandas dataframe flatten

Series(或df = pd.DataFrame([[[1,3], [2,3,4], [1,4,2,5]]], columns=['A', 'B', 'C']).T print(df) )由列表组成,如下所示:

              0
A        [1, 3]
B     [2, 3, 4]
C  [1, 4, 2, 5]

输出:

   0
A  1
A  2
B  2
B  3 
B  4
C  1
C  4
C  2 
C  5

如何将其转换为

apply()

我曾尝试使用[('A', 1), ('A', 3), ..],但这并不常用。我可以隐式转换吗?我还尝试将所有数字提取为from_records()的元组pd.DataFrame.from_records(df[0].map(lambda x: [(0, v) for v in x]).sum()) ,但我也无法做到这一点。

我想我可以这样做:

(0, v)

但我不知道如何访问索引.. note (x.index, v)实际上应该是'components' => [ ... // config 'response' => [ 'format' => \yii\web\Response::FORMAT_JSON ], ... // config ]

2 个答案:

答案 0 :(得分:1)

需要在列中展平值,然后按df = pd.DataFrame({0:np.concatenate(df.iloc[:, 0].values.tolist())}, index=df.index.repeat(df[0].str.len())) 的{​​{3}} repeat进行len索引:

from  itertools import chain
df=pd.DataFrame({0:list(chain.from_iterable(df.iloc[:, 0].values.tolist()))}, 
                 index=df.index.repeat(df[0].str.len()))
print (df)
   0
A  1
A  3
B  2
B  3
B  4
C  1
C  4
C  2
C  5
np.random.seed(456)

N = 100000
a = [list(range(np.random.randint(5, 20))) for _ in range(N)]
L = list('abcdefghijklmno') 
df = pd.DataFrame({0:a}, index=np.random.choice(L, size=N))
print (df)

In [348]: %timeit pd.DataFrame({0:np.concatenate(df.iloc[:, 0].values.tolist())}, index=df.index.repeat(df[0].str.len()))
1 loop, best of 3: 218 ms per loop

In [349]: %timeit pd.DataFrame({0:list(chain.from_iterable(df[0].values.tolist()))}, index=df.index.repeat(df[0].str.len()))
1 loop, best of 3: 388 ms per loop

In [350]: %timeit pd.DataFrame(df.iloc[:, 0].tolist(), index=df.index).stack().reset_index(level=1, drop=1).to_frame().astype(int)
1 loop, best of 3: 384 ms per loop

<强>计时

 while ((bytesRead = inputStream.read(content)) != -1) {

答案 1 :(得分:1)

使用pd.DataFrame + stack + reset_index + to_frame

df = pd.DataFrame(df.iloc[:, 0].tolist(), index=df.index)\
                         .stack().reset_index(level=1, drop=1).to_frame()
df

     0
A  1.0
A  3.0
B  2.0
B  3.0
B  4.0
C  1.0
C  4.0
C  2.0
C  5.0