Pandas Dataframe 重复行基于一列中的唯一值,因此每个唯一值具有相同的行数
Pandas Dataframe duplicate rows with mean-based on the unique value in one column and so that each unique value have same number of rows
我有一个如下所示的数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame({"Colum1":
["A", "A", "A", "A", "B", "B", "B", "C", "C", "D"],
"Colum2": [24., 25, 21., 33, 26, 24., 25, 21., 33, 26],
"Colum3": [0.2, 0.3, 0.4, 0.5, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]})
Colum1 Colum2 Colum3
0 A 24.0 0.2
1 A 25.0 0.3
2 A 21.0 0.4
3 A 33.0 0.5
4 B 26.0 0.6
5 B 24.0 0.2
6 B 25.0 0.3
7 C 21.0 0.4
8 C 33.0 0.5
9 D 26.0 0.6
这里我有4行对应A,3行对应B,2行C,1行D。
如何使用平均值为 B、C 和 D 添加行,使其与 A 具有相同的数字以具有 4 行?
例如 B 对于 colum2 的平均值是 (26+25+24)/3 = 25 而对于 colum3 是 (0.6+0.2+0.3)/3 = 0.37
所以我添加一行 B 25 0.37
对于 C,只有 2 行,第 2 列和第 3 列的平均值分别为 27 和 0.45
所以我添加了两行 C 27 0.45
对于 D 只有一行,所以我们添加具有相同值的三行
目标是:
Colum1 Colum2 Colum3
0 A 24.0 0.2
1 A 25.0 0.3
2 A 21.0 0.4
3 A 33.0 0.5
4 B 26.0 0.6
5 B 24.0 0.2
6 B 25.0 0.3
7 B 25.0 0.37
8 C 21.0 0.4
9 C 33.0 0.5
10 C 27.0 0.45
11 C 27.0 0.45
12 D 26.0 0.6
13 D 26.0 0.6
14 D 26.0 0.6
15 D 26.0 0.6
我想这就是您要找的。
df = pd.DataFrame({"Colum1":
["A", "A", "A", "A", "B", "B", "B", "C", "C", "D"],
"Colum2": [24., 25, 21., 33, 26, 24., 25, 21., 33, 26],
"Colum3": [0.2, 0.3, 0.4, 0.5, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]})
# get max value
max_val = df.groupby('Colum1').size().max()
# get mean for each group(A, B, C, D)
mean_df = df.groupby('Colum1').mean().reset_index()
new_df = []
for col, grp in df.groupby('Colum1'):
append_list = [grp]
if(len(grp) < max_val):
for i in range(max_val - len(grp)):
append_list.append(mean_df[mean_df['Colum1'] == col])
new_df.append(pd.concat(append_list))
output_df = pd.concat(new_df)
output_df
解决方案
g = df.groupby('Colum1')
avg, s = g.mean(), g.size()
rows = avg.loc[avg.index.repeat(s.max() - s)]
pd.concat([df, rows.reset_index()]).sort_values('Colum1')
已解释
计算每组mean
和size
>>> avg
Colum2 Colum3
Colum1
A 25.75 0.350000
B 25.00 0.366667
C 27.00 0.450000
D 26.00 0.600000
>>> s
Colum1
A 4
B 3
C 2
D 1
dtype: int64
Repeat
avg
数据帧的行 N 次,其中 N 是通过从最大组大小中减去每个组的大小获得的
>>> rows
Colum2 Colum3
Colum1
B 25.0 0.366667
C 27.0 0.450000
C 27.0 0.450000
D 26.0 0.600000
D 26.0 0.600000
D 26.0 0.600000
Concat
采样的原始数据帧 rows
以获得具有平衡组分布的数据帧
Colum1 Colum2 Colum3
0 A 24.0 0.200000
1 A 25.0 0.300000
2 A 21.0 0.400000
3 A 33.0 0.500000
4 B 26.0 0.600000
5 B 24.0 0.200000
6 B 25.0 0.300000
0 B 25.0 0.366667
7 C 21.0 0.400000
8 C 33.0 0.500000
1 C 27.0 0.450000
2 C 27.0 0.450000
9 D 26.0 0.600000
3 D 26.0 0.600000
4 D 26.0 0.600000
5 D 26.0 0.600000
这是一种使用整形的方法:
(df
.assign(idx=df.groupby('Colum1').cumcount())
.pivot('idx', 'Colum1')
.pipe(lambda d: d.fillna(d.mean()))
.stack()
.reset_index('Colum1')
.sort_values(by='Colum1')
)
输出:
Colum1 Colum2 Colum3
idx
0 A 24.0 0.200000
1 A 25.0 0.300000
2 A 21.0 0.400000
3 A 33.0 0.500000
0 B 26.0 0.600000
1 B 24.0 0.200000
2 B 25.0 0.300000
3 B 25.0 0.366667
0 C 21.0 0.400000
1 C 33.0 0.500000
2 C 27.0 0.450000
3 C 27.0 0.450000
0 D 26.0 0.600000
1 D 26.0 0.600000
2 D 26.0 0.600000
3 D 26.0 0.600000
我有一个如下所示的数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame({"Colum1":
["A", "A", "A", "A", "B", "B", "B", "C", "C", "D"],
"Colum2": [24., 25, 21., 33, 26, 24., 25, 21., 33, 26],
"Colum3": [0.2, 0.3, 0.4, 0.5, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]})
Colum1 Colum2 Colum3
0 A 24.0 0.2
1 A 25.0 0.3
2 A 21.0 0.4
3 A 33.0 0.5
4 B 26.0 0.6
5 B 24.0 0.2
6 B 25.0 0.3
7 C 21.0 0.4
8 C 33.0 0.5
9 D 26.0 0.6
这里我有4行对应A,3行对应B,2行C,1行D。
如何使用平均值为 B、C 和 D 添加行,使其与 A 具有相同的数字以具有 4 行? 例如 B 对于 colum2 的平均值是 (26+25+24)/3 = 25 而对于 colum3 是 (0.6+0.2+0.3)/3 = 0.37 所以我添加一行 B 25 0.37
对于 C,只有 2 行,第 2 列和第 3 列的平均值分别为 27 和 0.45 所以我添加了两行 C 27 0.45
对于 D 只有一行,所以我们添加具有相同值的三行
目标是:
Colum1 Colum2 Colum3
0 A 24.0 0.2
1 A 25.0 0.3
2 A 21.0 0.4
3 A 33.0 0.5
4 B 26.0 0.6
5 B 24.0 0.2
6 B 25.0 0.3
7 B 25.0 0.37
8 C 21.0 0.4
9 C 33.0 0.5
10 C 27.0 0.45
11 C 27.0 0.45
12 D 26.0 0.6
13 D 26.0 0.6
14 D 26.0 0.6
15 D 26.0 0.6
我想这就是您要找的。
df = pd.DataFrame({"Colum1":
["A", "A", "A", "A", "B", "B", "B", "C", "C", "D"],
"Colum2": [24., 25, 21., 33, 26, 24., 25, 21., 33, 26],
"Colum3": [0.2, 0.3, 0.4, 0.5, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]})
# get max value
max_val = df.groupby('Colum1').size().max()
# get mean for each group(A, B, C, D)
mean_df = df.groupby('Colum1').mean().reset_index()
new_df = []
for col, grp in df.groupby('Colum1'):
append_list = [grp]
if(len(grp) < max_val):
for i in range(max_val - len(grp)):
append_list.append(mean_df[mean_df['Colum1'] == col])
new_df.append(pd.concat(append_list))
output_df = pd.concat(new_df)
output_df
解决方案
g = df.groupby('Colum1')
avg, s = g.mean(), g.size()
rows = avg.loc[avg.index.repeat(s.max() - s)]
pd.concat([df, rows.reset_index()]).sort_values('Colum1')
已解释
计算每组mean
和size
>>> avg
Colum2 Colum3
Colum1
A 25.75 0.350000
B 25.00 0.366667
C 27.00 0.450000
D 26.00 0.600000
>>> s
Colum1
A 4
B 3
C 2
D 1
dtype: int64
Repeat
avg
数据帧的行 N 次,其中 N 是通过从最大组大小中减去每个组的大小获得的
>>> rows
Colum2 Colum3
Colum1
B 25.0 0.366667
C 27.0 0.450000
C 27.0 0.450000
D 26.0 0.600000
D 26.0 0.600000
D 26.0 0.600000
Concat
采样的原始数据帧 rows
以获得具有平衡组分布的数据帧
Colum1 Colum2 Colum3
0 A 24.0 0.200000
1 A 25.0 0.300000
2 A 21.0 0.400000
3 A 33.0 0.500000
4 B 26.0 0.600000
5 B 24.0 0.200000
6 B 25.0 0.300000
0 B 25.0 0.366667
7 C 21.0 0.400000
8 C 33.0 0.500000
1 C 27.0 0.450000
2 C 27.0 0.450000
9 D 26.0 0.600000
3 D 26.0 0.600000
4 D 26.0 0.600000
5 D 26.0 0.600000
这是一种使用整形的方法:
(df
.assign(idx=df.groupby('Colum1').cumcount())
.pivot('idx', 'Colum1')
.pipe(lambda d: d.fillna(d.mean()))
.stack()
.reset_index('Colum1')
.sort_values(by='Colum1')
)
输出:
Colum1 Colum2 Colum3
idx
0 A 24.0 0.200000
1 A 25.0 0.300000
2 A 21.0 0.400000
3 A 33.0 0.500000
0 B 26.0 0.600000
1 B 24.0 0.200000
2 B 25.0 0.300000
3 B 25.0 0.366667
0 C 21.0 0.400000
1 C 33.0 0.500000
2 C 27.0 0.450000
3 C 27.0 0.450000
0 D 26.0 0.600000
1 D 26.0 0.600000
2 D 26.0 0.600000
3 D 26.0 0.600000