有没有什么好的方法可以根据条件水平或广泛地附加数据?
Is there any good way to append data horizontally or widely based on condition?
<pre> df1
+-----+-----+-----+-----+
| id | rc | fq | mt |
+-----+-----+-----+-----+
| 1 | a | 3 | 13 |
| 2 | b | 2 | 31 |
| 3 | c | 4 | 23 |
| 4 | d | 1 | 7 |
| 5 | e | 6 | 9 |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
+-----+-----+-----+-----+
<pre> df2
+----+---------+----------+
| id | keyword | location |
+----+---------+----------+
| 1 | james | (1,3) |
| 1 | john | (2,3) |
| 2 | daniel | (3,9) |
| 3 | peter | (5,2) |
| 3 | hugh | (7,1) |
| 3 | kevin | (2,1) |
| 4 | jack | (0,8) |
| 5 | chris | (4,2) |
| 5 | lisa | (9,0) |
| … | … | … |
| … | … | … |
| … | … | … |
+----+---------+----------+
<pre> df3
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
| id | rc | fq | mt | keyword1 | location1 | keyword2 | location2 | keyword3 | location3 | … | keyword_n | location_n |
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
| 1 | a | 3 | 13 | james | (1,3) | john | (2,3) | | | … | | |
| 2 | b | 2 | 31 | daniel | (3,9) | | | | | … | | |
| 3 | c | 4 | 23 | peter | (5,2) | hugh | (7,1) | kevin | (2,1) | … | | |
| 4 | d | 1 | 7 | jack | (0,8) | | | | | … | | |
| 5 | e | 6 | 9 | chris | (4,2) | lisa | (9,0) | | | … | | |
| | | | | | | | | | | … | | |
| | | | | | | | | | | … | | |
| | | | | | | | | | | … | | |
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
[我有一个宽格式 pandas 数据框,其中 'id' 列表示每行的唯一值。][df1]
[并且 df2 还包含 'id'、'keyword' 和 'location' 列。 df2 中的 ID 源自 df1,因此 df1 和 df2 共享 'id' 值。][df2]
[最后,这个 df3 是 df1 和 df2 的期望输出。如果 df2 中的 id 与 df1 中的 id 具有相同的值,则 'keyword' 和 'location' 列中的值应广泛或水平地附加以创建新列。][df3]
大家好,
我附上图片以便更好地解释。 (请检查一下!)
我尝试了 loc、concat、merge 和 pivot_table 等,但无法弄清楚。
请问有人可以就此提出一些建议吗?
谢谢!
- 抱歉附上图片而不是插入 ascii table。图片已删除!
使用:
- 第一
set_index
by column id
and counter created by cumcount
- 重塑
unstack
- 按
sort_index
对列中的第二级 Multiindex 进行排序
- 通过
map
和 join
将列展平
join
到第一个 DataFrame
s = df2.groupby('id').cumcount().add(1).astype(str)
df2 = df2.set_index(['id', s]).unstack().sort_index(axis=1, level=1)
df2.columns = df2.columns.map(''.join)
df = df1.join(df2, on='id')
print (df)
id CC fq mt keyword1 location1 keyword2 location2 keyword3 location3
0 1 a 3 13 james (1,3) john (2,3) None None
1 2 b 2 31 daniel (3,9) None None None None
2 3 c 4 23 peter (5,2) hugh (7,1) kevin (2,1)
3 4 d 1 7 jack (0,8) None None None None
4 5 e 6 9 chris (4,2) lisa (9,0) None None
<pre> df1
+-----+-----+-----+-----+
| id | rc | fq | mt |
+-----+-----+-----+-----+
| 1 | a | 3 | 13 |
| 2 | b | 2 | 31 |
| 3 | c | 4 | 23 |
| 4 | d | 1 | 7 |
| 5 | e | 6 | 9 |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
| ... | ... | ... | ... |
+-----+-----+-----+-----+
<pre> df2
+----+---------+----------+
| id | keyword | location |
+----+---------+----------+
| 1 | james | (1,3) |
| 1 | john | (2,3) |
| 2 | daniel | (3,9) |
| 3 | peter | (5,2) |
| 3 | hugh | (7,1) |
| 3 | kevin | (2,1) |
| 4 | jack | (0,8) |
| 5 | chris | (4,2) |
| 5 | lisa | (9,0) |
| … | … | … |
| … | … | … |
| … | … | … |
+----+---------+----------+
<pre> df3
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
| id | rc | fq | mt | keyword1 | location1 | keyword2 | location2 | keyword3 | location3 | … | keyword_n | location_n |
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
| 1 | a | 3 | 13 | james | (1,3) | john | (2,3) | | | … | | |
| 2 | b | 2 | 31 | daniel | (3,9) | | | | | … | | |
| 3 | c | 4 | 23 | peter | (5,2) | hugh | (7,1) | kevin | (2,1) | … | | |
| 4 | d | 1 | 7 | jack | (0,8) | | | | | … | | |
| 5 | e | 6 | 9 | chris | (4,2) | lisa | (9,0) | | | … | | |
| | | | | | | | | | | … | | |
| | | | | | | | | | | … | | |
| | | | | | | | | | | … | | |
+----+----+----+----+----------+-----------+----------+-----------+----------+-----------+---+-----------+------------+
[我有一个宽格式 pandas 数据框,其中 'id' 列表示每行的唯一值。][df1]
[并且 df2 还包含 'id'、'keyword' 和 'location' 列。 df2 中的 ID 源自 df1,因此 df1 和 df2 共享 'id' 值。][df2]
[最后,这个 df3 是 df1 和 df2 的期望输出。如果 df2 中的 id 与 df1 中的 id 具有相同的值,则 'keyword' 和 'location' 列中的值应广泛或水平地附加以创建新列。][df3]
大家好,
我附上图片以便更好地解释。 (请检查一下!)
我尝试了 loc、concat、merge 和 pivot_table 等,但无法弄清楚。 请问有人可以就此提出一些建议吗?
谢谢!
- 抱歉附上图片而不是插入 ascii table。图片已删除!
使用:
- 第一
set_index
by columnid
and counter created bycumcount
- 重塑
unstack
- 按
sort_index
对列中的第二级 Multiindex 进行排序
- 通过
map
和join
将列展平
join
到第一个DataFrame
s = df2.groupby('id').cumcount().add(1).astype(str)
df2 = df2.set_index(['id', s]).unstack().sort_index(axis=1, level=1)
df2.columns = df2.columns.map(''.join)
df = df1.join(df2, on='id')
print (df)
id CC fq mt keyword1 location1 keyword2 location2 keyword3 location3
0 1 a 3 13 james (1,3) john (2,3) None None
1 2 b 2 31 daniel (3,9) None None None None
2 3 c 4 23 peter (5,2) hugh (7,1) kevin (2,1)
3 4 d 1 7 jack (0,8) None None None None
4 5 e 6 9 chris (4,2) lisa (9,0) None None