我有以下格式的pandas数据框:
User app percent
1 a 0.8
1 b 0.3
1 c 0.2
1 d 0.9
1 e 0.6
1 f 0.8
1 g 0.4
1 h 0.2
1 i 0.1
1 j 0.6
每个用户至少有10个应用。
我需要一个循环,它将在百分比列中添加值为0.5的每个用户行。
每个用户的行总数为50。
例如,用户编号1有10个应用程序,因此循环需要超过表中的10个值并生成40行0.5值。
最后一个单元格将乘以上表中的10个值(百分比列),并将其乘以0.5值-40次。
这是用户编号1的计算:
0.8* 0.3* 0.2* 0.9* 0.6* 0.8* 0.4* 0.2* 0.1* 0.6* 0.5* 0.5*.....*0.5
答案 0 :(得分:0)
我认为您需要为每个用户提供汇总size
和GroupBy.prod
,并按numpy.power
- Series
创建的0.5
汇总由减去{{{ 1}}来自50
:
a['size']
行的示例,而不是8
,以便更好地验证:
50
print (df)
User app percent
0 1 a 0.8
1 1 b 0.3
2 1 c 0.2
3 1 d 0.9
4 1 e 0.6
5 1 f 0.8
6 2 g 0.4
7 2 h 0.2
8 2 i 0.1
9 2 j 0.6
a = df.groupby('User')['percent'].agg(['size','prod'])
print (a)
size prod
User
1 6 0.020736
2 4 0.004800
b = a['prod'] * np.power(0.5, a['size'].rsub(8))
#same as
#b = a['prod'] * np.power(0.5, 8 - a['size'])
print (b)
User
1 0.005184
2 0.000300
dtype: float64
添加reset_index
:
DataFrame
答案 1 :(得分:0)
看看这是否是您正在寻找的 -
{{1}}
输出
{{1}}
答案 2 :(得分:0)
我可能仅为用户1提供一个示例。这里我生成一个类似的数据,然后将它乘以5次以获得每行5次重复,总共50行。然后我把它作为数据帧。
import pandas
import numpy
import random
user = [1 for i in range(10)]
app = ['a'+str(i+1) for i in range(10)]
percent = [0.1 + i*0.1 for i in range(10)]
data = list(zip(user, app, percent));
data_to_edit = 5*data;
df = pandas.DataFrame(data_to_edit, columns=['User','App','Percent']);
现在创建前10个百分比数据(原始数据)的产品。
percent_product=numpy.prod(df['Percent'][0:9]);
现在我们需要做的就是编辑剩余的40行,但仅限于'Percent'
列。
for i in df.index[10:]:
df['Percent'][i] = percent_product*(0.5**(i-9));
现在前10行将是相同的,但其他行乘以0.5的倍数。
这是你的意思吗?