pandas groupby和某列各值出现的百分比
pandas groupby and percentage of occurrences of each value of a column
我有一个这样的 pandas 数据框,想创建一个像 created_column
:
这样的列
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
......
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
......
1234 1 0 0 0 1 a 1
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 1
说明:
我想创建一个列,其中行中有 1 个,其中 iv_5
列中的值出现的数据少于或等于 40%,这将适用于值为 1、3 和 5 的行,如图所示在上面的例子中。我该怎么做?
第二个问题:
我如何在创建其他列时也包括小于 x% 和大于 y%,就像上面的列创建一样。
使用 GroupBy.transform
with divide length of DtaFrame
and test by Series.le
小于或等于:
df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).le(0.4).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
1234 1 0 0 0 1 a 1
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 1
或:
s = df['iv_5'].value_counts(normalize=True)
idx = s.index[s <= 0.4]
df['created_column'] = df['iv_5'].isin(idx).view('i1')
如果需要Series.between
,默认都包含,表示>=
,<=
,>
和<
使用参数[=22] =]:
df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).between(0.2, 0.5).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
1234 1 0 0 0 1 a 0
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 0
如果需要像>
和<=
这样的组合不能使用,这里有替代方案:
s1 = df.groupby('iv_5')['iv_5'].transform('size').div(len(df))
df['created_column'] = ((s1 > 0.2) & (s1 <= 0.6)).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 1
333 0 0 0 0 0 b 1
222 1 2 3 4 5 aa 0
324 1 2 3 4 5 cc 0
1234 1 0 0 0 1 a 0
1235 0 2 0 4 0 a 1
1236 0 0 3 0 0 a 1
1237 0 0 1 0 0 b 1
1238 0 2 0 2 0 b 1
1239 3 0 0 0 3 b 0
我有一个这样的 pandas 数据框,想创建一个像 created_column
:
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
......
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
......
1234 1 0 0 0 1 a 1
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 1
说明:
我想创建一个列,其中行中有 1 个,其中 iv_5
列中的值出现的数据少于或等于 40%,这将适用于值为 1、3 和 5 的行,如图所示在上面的例子中。我该怎么做?
第二个问题:
我如何在创建其他列时也包括小于 x% 和大于 y%,就像上面的列创建一样。
使用 GroupBy.transform
with divide length of DtaFrame
and test by Series.le
小于或等于:
df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).le(0.4).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
1234 1 0 0 0 1 a 1
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 1
或:
s = df['iv_5'].value_counts(normalize=True)
idx = s.index[s <= 0.4]
df['created_column'] = df['iv_5'].isin(idx).view('i1')
如果需要Series.between
,默认都包含,表示>=
,<=
,>
和<
使用参数[=22] =]:
df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).between(0.2, 0.5).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 0
333 0 0 0 0 0 b 0
222 1 2 3 4 5 aa 1
324 1 2 3 4 5 cc 1
1234 1 0 0 0 1 a 0
1235 0 2 0 4 0 a 0
1236 0 0 3 0 0 a 0
1237 0 0 1 0 0 b 0
1238 0 2 0 2 0 b 0
1239 3 0 0 0 3 b 0
如果需要像>
和<=
这样的组合不能使用,这里有替代方案:
s1 = df.groupby('iv_5')['iv_5'].transform('size').div(len(df))
df['created_column'] = ((s1 > 0.2) & (s1 <= 0.6)).view('i1')
print (df)
iv_1 iv_2 iv_3 iv_4 iv_5 col2rplc created_column
0 0 0 0 0 0 a 1
333 0 0 0 0 0 b 1
222 1 2 3 4 5 aa 0
324 1 2 3 4 5 cc 0
1234 1 0 0 0 1 a 0
1235 0 2 0 4 0 a 1
1236 0 0 3 0 0 a 1
1237 0 0 1 0 0 b 1
1238 0 2 0 2 0 b 1
1239 3 0 0 0 3 b 0