concat列表中的pandas数据框,但忽略了列名

Dar*_*ook 6 python rbind pandas

小标题:将它愚蠢到大熊猫,不要试图变得聪明.

我有一个list(res)的单列pandas数据帧,每个数据帧都包含相同类型的数字数据,但每个都有不同的列名.行索引没有意义.我想将它们放入一个非常长的单列数据帧中.

当我这样做时,pd.concat(res)我为每个输入文件(以及NaN单元的加载和加载)获得一列.我已经为参数(*)尝试了各种值,但没有一个能够完成我所追求的目标.

编辑:示例数据:

res = [
    pd.DataFrame({'A':[1,2,3]}),
    pd.DataFrame({'B':[9,8,7,6,5,4]}),
    pd.DataFrame({'C':[100,200,300,400]}),
]
Run Code Online (Sandbox Code Playgroud)

我有一个丑陋的黑客解决方案:复制每个数据框并给它一个新的列名:

newList = []
for r in res:
  r.columns = ["same"]
  newList.append(r)
pd.concat( newList, ignore_index=True )
Run Code Online (Sandbox Code Playgroud)

当然这不是最好的方法吗?

顺便说一句,熊猫:不同列名的concat数据框是相似的,但我的问题更简单,因为我不想保持索引.(我还从N个单列数据帧的列表开始,而不是单个N列数据帧.)

*:例如axis=0,默认行为.axis=1给出错误.join="inner"只是愚蠢(我只得到索引).ignore_index=True重新编号索引,但我得到了很多列,很多NaN.


更新空列表

当数据有一个空列表时,我遇到了问题(使用所有给定的解决方案),例如:

res = [
    pd.DataFrame({'A':[1,2,3]}),
    pd.DataFrame({'B':[9,8,7,6,5,4]}),
    pd.DataFrame({'C':[]}),
    pd.DataFrame({'D':[100,200,300,400]}),
]
Run Code Online (Sandbox Code Playgroud)

诀窍是通过添加强制类型.astype('float64').例如

pd.Series(np.concatenate([df.values.ravel().astype('float64') for df in res]))
Run Code Online (Sandbox Code Playgroud)

要么:

pd.concat(res,axis=0).astype('float64').stack().reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

我认为你需要concatstack:

print (pd.concat(res, axis=1))
     A  B      C
0  1.0  9  100.0
1  2.0  8  200.0
2  3.0  7  300.0
3  NaN  6  400.0
4  NaN  5    NaN
5  NaN  4    NaN

print (pd.concat(res, axis=1).stack().reset_index(drop=True))
0       1.0
1       9.0
2     100.0
3       2.0
4       8.0
5     200.0
6       3.0
7       7.0
8     300.0
9       6.0
10    400.0
11      5.0
12      4.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

numpy.ravel用于展平的另一种解决方案:

print (pd.Series(pd.concat(res, axis=1).values.ravel()).dropna())
0       1.0
1       9.0
2     100.0
3       2.0
4       8.0
5     200.0
6       3.0
7       7.0
8     300.0
10      6.0
11    400.0
13      5.0
16      4.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)
print (pd.DataFrame(pd.concat(res, axis=1).values.ravel(), columns=['col']).dropna())
      col
0     1.0
1     9.0
2   100.0
3     2.0
4     8.0
5   200.0
6     3.0
7     7.0
8   300.0
10    6.0
11  400.0
13    5.0
16    4.0
Run Code Online (Sandbox Code Playgroud)

解决方案list comprehension:

print (pd.Series(np.concatenate([df.values.ravel() for df in res])))
0       1
1       2
2       3
3       9
4       8
5       7
6       6
7       5
8       4
9     100
10    200
11    300
12    400
dtype: int64 
Run Code Online (Sandbox Code Playgroud)


Ste*_*n G 2

我会使用列表理解,例如:

\n\n
import pandas as pd\nres = [\n    pd.DataFrame({'A':[1,2,3]}),\n    pd.DataFrame({'B':[9,8,7,6,5,4]}),\n    pd.DataFrame({'C':[100,200,300,400]}),\n]\n\n\nx = []\n[x.extend(df.values.tolist()) for df in res]\npd.DataFrame(x)\n\nOut[49]: \n      0\n0     1\n1     2\n2     3\n3     9\n4     8\n5     7\n6     6\n7     5\n8     4\n9   100\n10  200\n11  300\n12  400\n
Run Code Online (Sandbox Code Playgroud)\n\n

我给你测试了一下速度。

\n\n
%timeit x = []; [x.extend(df.values.tolist()) for df in res]; pd.DataFrame(x)\n10000 loops, best of 3: 196 \xc2\xb5s per loop\n%timeit pd.Series(pd.concat(res, axis=1).values.ravel()).dropna()\n1000 loops, best of 3: 920 \xc2\xb5s per loop\n%timeit pd.concat(res, axis=1).stack().reset_index(drop=True)\n1000 loops, best of 3: 902 \xc2\xb5s per loop\n%timeit pd.DataFrame(pd.concat(res, axis=1).values.ravel(), columns=['col']).dropna()\n1000 loops, best of 3: 1.07 ms per loop\n%timeit pd.Series(np.concatenate([df.values.ravel() for df in res]))\n10000 loops, best of 3: 70.2 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

好像

\n\n
pd.Series(np.concatenate([df.values.ravel() for df in res]))\n
Run Code Online (Sandbox Code Playgroud)\n\n

是最快的。

\n