【问题标题】:create dataframe that number of rows equals to the sum of values in a column in original dataframe in python在python中创建行数等于原始数据框中列中值的总和的数据框
【发布时间】:2022-07-04 13:01:32
【问题描述】:

假设我有一个这样的数据框

filmweb   female male   total(female +male)
member     10     5     15
VIP        5      3     8
member     12     nan   12
VIP        7      nan   7
.....

假设有许多不同的电影流媒体平台作为列 [filmweb]。 如果成员总数为 1000,我想创建一个具有 1000 行(作为索引)的新数据框,如果成员是女性,则分配 1,0-男性,1-VIP,0-非 VIP 最终的数据框类似于

     female  male  VIP 
0      1      0     1 
1      0      1     0  
2      1      0     0   
....
999    1      0     1  

希望我的问题是有道理的。提前谢谢你。

【问题讨论】:

  • 第一个数据帧中有一些 nan 值是否有原因?不应该是 0 吗?如果我正确理解您的问题,假设您的第一个 df 是您收集的所有数据,有 42 个用户,那么您的第二个数据框应该有 42 行,对吗?
  • 您好,在原始数据框中,存在缺失值,最好保留它。而且我只计算来自“会员”的用户,因为“VIP”用户是“会员”的一部分。所以对于前 4 行,它应该转换为 27 行。这意味着 27 个用户中有 15 个是 VIP,而 12 个不是。
  • 我认为这是一个非常好的问题。希望像@jezrael 这样的人可能会来看看。
  • @Emma 抱歉我的第一个答案,我严重误解了这个问题。我在下面对其进行了更改。
  • @BeRT2me 不用担心谢谢您的回答。真的很有帮助。

标签: python pandas dataframe


【解决方案1】:
def fill_template(f, m, vip):
    return [{'female': f, 'male': m, 'VIP': vip}]

order = ['female', 'male']
totals = df.groupby('filmweb')[order].sum()
female, male = totals.loc['member'].sub(totals.loc['VIP'])[order]
vip_female, vip_male = totals.loc['VIP'][order]

new_df = pd.DataFrame(fill_template(1, 0, 0)*int(female) +
                      fill_template(0, 1, 0)*int(male) +
                      fill_template(1, 0, 1)*int(vip_female) +
                      fill_template(0, 1, 1)*int(vip_male))
print(new_df)

输出:

    female  male  VIP
0        1     0    0
1        1     0    0
2        1     0    0
3        1     0    0
4        1     0    0
5        1     0    0
6        1     0    0
7        1     0    0
8        1     0    0
9        1     0    0
10       0     1    0
11       0     1    0
12       1     0    1
13       1     0    1
14       1     0    1
15       1     0    1
16       1     0    1
17       1     0    1
18       1     0    1
19       1     0    1
20       1     0    1
21       1     0    1
22       1     0    1
23       1     0    1
24       0     1    1
25       0     1    1
26       0     1    1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2021-08-12
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多