python - 如何有效地增加数据帧
问题描述
我有一个如下所示的数据框,
df=pd.DataFrame({'col1':[1,2,3,4,5],'col2':list('abcde')})
我想按其内容的长度复制数据帧。
基本上我想让col1中的每个值都与col2的全部内容相加。
输入:
col1 col2
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
输出/输出:
col1 col2
0 1 a
1 1 b
2 1 c
3 1 d
4 1 e
5 2 a
6 2 b
7 2 c
8 2 d
9 2 e
10 3 a
11 3 b
12 3 c
13 3 d
14 3 e
15 4 a
16 4 b
17 4 c
18 4 d
19 4 e
20 5 a
21 5 b
22 5 c
23 5 d
24 5 e
为此,我使用了这个,
op=[]
for val in df.col1.values:
temp=df.copy()
temp['col1']=val
op.append(temp)
print(pd.concat(op,ignore_index=True))
我想以更好的方式获得准确的输出(不包括循环)
解决方案
使用交叉连接并过滤必要的列:
df = pd.merge(df.assign(a=1), df.assign(a=1), on='a')[['col1_x','col2_y']]
df = df.rename(columns = lambda x: x.split('_')[0])
print (df)
col1 col2
0 1 a
1 1 b
2 1 c
3 1 d
4 1 e
5 2 a
6 2 b
7 2 c
8 2 d
9 2 e
10 3 a
11 3 b
12 3 c
13 3 d
14 3 e
15 4 a
16 4 b
17 4 c
18 4 d
19 4 e
20 5 a
21 5 b
22 5 c
23 5 d
24 5 e
推荐阅读
- kubernetes - Kubernetes 节点不可用,CPU 不足
- ajax - 当 div 内容应该每 5 秒刷新一次时,两个如何在多个 div 之间切换?
- javascript - 如何使用 XMLHttpRequest 示例格式化 request.get
- javascript - Angular 6将数据从父级传递给子级Bootstrap Modal
- javascript - Three.js 雾,最大不透明度
- javascript - 正则表达式 - 4 位数字,可选 1 或 2 位小数
- java - OpenGL ES 纹理未正确渲染
- java - 字段的任何注释,类似于 JAVA 中的 db 生成序列
- java - 我在继承代码中使用 JPA 中的谓词时遇到问题
- javascript - 一旦选择文件而不在img上获得404,如何触发Cropper?