如何在熊猫中将一组行混在一起(行具有唯一的ID)
Posted
技术标签:
【中文标题】如何在熊猫中将一组行混在一起(行具有唯一的ID)【英文标题】:how to shuffle set of rows together (rows have unique id) in pandas 【发布时间】:2018-12-10 19:02:24 【问题描述】:我想对数据框进行洗牌,将一组行放在一起。一起的行数不是恒定的,但我有一列用相同的 Id 标记它们。
对于 EX: 在下面的数据中,第一列是唯一的标记,指定在洗牌时哪些行需要放在一起。
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 46 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 4 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 39 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 10 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 7 -135.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 0 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 35 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 5 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 47 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 12 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 13 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 20 -201.00
2 56.00 1 0.83 2.16 3147890 3120000.00 1 201.00 0 -201.00 116.00 75.88 201.00 232.00 105.74 201.00 168.00 75.88 42 -201.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 46 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 4 -95.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 39 -46.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 10 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 7 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 0 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 35 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 5 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 47 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 12 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 13 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 20 -135.00
4 93.00 1 0.34 3.62 4121000 5340000.00 1 135.00 0 -135.00 78.00 120.53 135.00 10.00 2.67 135.00 313.00 120.53 42 -135.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 46 -2730.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 4 -2458.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 39 -2758.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 10 -2758.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 7 -2554.00
6 74.00 0 2.35 2.89 1680840 2940000.00 11 2758.00 0 -2758.00 296.00 74.46 261.00 176.00 75.84 304.00 304.00 74.46 0 -2568.00
【问题讨论】:
你能提供一个你正在寻找的输出的例子吗?我可以想到对您的问题的几种解释。最终结果是否仍然会有那些首先具有 2 个标记但与该组一起洗牌的那些?这些组是否保持原来的顺序,但作为一个整体进行了洗牌? 在上面的数据中,我有 13 行带有唯一标记(基于第 1 列)2、13 行带有标记 4、6 行带有标记 6。洗牌后,一个结果可能是所有带有标记的行首先是 6,然后是标记 2 和标记 4 的行。 你想用一个组来打乱组或行吗?也许两者兼而有之?组的顺序和每个组中的行? @ScottBoston - 对不起,我不明白你的问题。但希望我的上述评论解释了我需要实现的目标。谢谢。 @ScottBoston - 不排序,而是打乱数据!! 【参考方案1】:您可以将此生成器与唯一 col1 上的 np.random.choice
一起使用,pd.concat
以重新组装“组”。
import numpy as np
pd.concat((df[df['col1'] == i] for i in np.random.choice(df['col1'].unique(),
df['col1'].nunique())))
详细信息,首先使用unique
从'col1' 中获取唯一值作为列表,然后使用np.random.choice
从该列表中选择随机元素。使用该选择使用for-in
语法在生成器内布尔选择数据帧的部分(“组”),最后,使用pd.concat
将数据帧重新组装到随机组中。
【讨论】:
【参考方案2】:目前尚不清楚您要寻找什么最终结果,但无论如何,第一步可能是相同的。根据该列将数据框分组为单独的数据框。根据需要随机播放和重新组合。
可以通过将混洗后的数据帧存储为列表然后pd.concat
来完成重组。您可以选择先随机播放列表:
from random import shuffle
shuffle(dfs)
使用这个数据集:
2 a2
2 b2
2 c2
3 a3
3 b3
3 c3
3 d3
4 a4
4 b4
这段代码:
import pandas as pd
df = pd.read_csv("shuffle.txt", header=None, delim_whitespace=True)
dfs = [x for _, x in df.groupby(df[0])]
from random import shuffle
#shuffle(dfs)
new_dfs = []
for df in dfs:
df = df.sample(frac=1)
new_dfs.append(df)
final_df = pd.concat(new_dfs)
print(final_df)
得到你:
0 1
2 2 c2
0 2 a2
1 2 b2
5 3 c3
3 3 a3
6 3 d3
4 3 b3
8 4 b4
7 4 a4
取消注释 shuffle 行可以获得:
0 1
8 4 b4
7 4 a4
6 3 d3
5 3 c3
4 3 b3
3 3 a3
0 2 a2
1 2 b2
2 2 c2
【讨论】:
谢谢。让我试试看。以上是关于如何在熊猫中将一组行混在一起(行具有唯一的ID)的主要内容,如果未能解决你的问题,请参考以下文章