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)
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)
我会使用列表理解,例如:
\n\nimport 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n好像
\n\npd.Series(np.concatenate([df.values.ravel() for df in res]))\nRun Code Online (Sandbox Code Playgroud)\n\n是最快的。
\n| 归档时间: |
|
| 查看次数: |
5115 次 |
| 最近记录: |