如何在数据帧之间随机分配值

时间:2017-07-31 16:33:28

标签: python pandas

我正在尝试将值从一个数据帧中的一列随机分配到12个不同类别(按年龄和性别)的另一个数据帧。例如,我有两个数据帧;让我们调用一个d1和另一个d2

  d1:
index agerange gender income
 0     2        1      56700
 1     2        0      25600
 2     4        0      3000
 3     4        0      106000
 4     3        0      200
 5     3        0      43000
 6     4        0      10000000

d2:
index agerange gender 
 0     3        0      
 1     2        0      
 2     4        0      
 3     4        0      

我想按年龄和性别对两个数据帧进行分组,即0-1,2,3,4,5,6& 1-1,2,3,4,5,6然后随机选择d1中的一个收入并将其分配给d2。

即:

d1:
index agerange gender income
 0     2        1      56700
 1     2        0      25600
 2     4        0      3000
 3     4        0      106000
 4     3        0      200
 5     3        0      43000
 6     4        0      10000000

d2:
index agerange gender  income
 0     3        0      200  
 1     2        0      25600 
 2     4        0      10000000
 3     4        0      3000

3 个答案:

答案 0 :(得分:4)

选项1
let foo = 1 bar = 2 return (foo, bar) np.random.choice的方法 我隐含假设我们为每一行替换随机绘制的值。

pd.DataFrame.query

选项2
尝试提高每组呼叫def take_one(x): q = 'agerange == {agerange} and gender == {gender}'.format(**x) return np.random.choice(d1.query(q).income) d2.assign(income=d2.apply(take_one, 1)) agerange gender income index 0 3 0 200 1 2 0 25600 2 4 0 106000 3 4 0 106000 一次的效率。

np.random.choice

调试和设置

g = d1.groupby(['agerange', 'gender']).income.apply(list)
f = lambda x: pd.Series(np.random.choice(g.get(x.name, [0] * len(x)), len(x)), x.index)
d2.groupby(['agerange', 'gender'], group_keys=False).apply(f)

       agerange  gender    income
index                            
0             3       0       200
1             2       0     25600
2             4       0  10000000
3             4       0    106000
import pandas as pd
import numpy as np

d1 = pd.DataFrame({
        'agerange': [2, 2, 4, 4, 3, 3, 4],
        'gender': [1, 0, 0, 0, 0, 0, 0],
        'income': [56700, 25600, 3000, 106000, 200, 43000, 10000000]
    }, pd.Index([0, 1, 2, 3, 4, 5, 6], name='index')
)

d2 = pd.DataFrame(
    {'agerange': [3, 2, 4, 4], 'gender': [0, 0, 0, 0]},
    pd.Index([0, 1, 2, 3], name='index')
)

g = d1.groupby(['agerange', 'gender']).income.apply(list)
f = lambda x: pd.Series(np.random.choice(g.loc[x.name], len(x)), x.index)
d2.assign(income=d2.groupby(['agerange', 'gender'], group_keys=False).apply(f))

答案 1 :(得分:3)

如何根据年龄范围创建收入字典,然后映射随机选择,即

#Based on unutbu's data
df1 = pd.DataFrame({'agerange': [2, 2, 4, 4, 3, 3, 4], 'gender': [1, 0, 0, 0, 0, 0, 0], 'income': [56700, 25600, 3000, 106000, 200, 43000, 10000000], 'index': [0, 1, 2, 3, 4, 5, 6]})
df2 = pd.DataFrame({'agerange': [3, 2, 4, 4], 'gender': [0, 0, 0, 0], 'index': [0, 1, 2, 3]})

age_groups = df1.groupby('agerange')['income'].agg(lambda x: tuple(x)).to_dict()
df2['income'] = df2['agerange'].map(lambda x: np.random.choice(age_groups[x]))

输出:

  agerange  gender  index  income
0         3       0      0   43000
1         2       0      1   25600
2         4       0      2  106000
3         4       0      3  106000

如果还需要性别组,那么你可以使用申请,如果你想填写0,找不到你可以使用的密钥,如果没有,即

df2 = pd.DataFrame({'agerange': [3, 2, 6, 4], 'gender': [0, 0, 0, 0], 'index': [0, 1, 2, 3]})
df1 = pd.DataFrame({'agerange': [2, 2, 4, 4, 3, 3, 4], 'gender': [1, 0, 0, 0, 0, 0, 0], 'income': [56700, 25600, 3000, 106000, 200, 43000, 10000000], 'index': [0, 1, 2, 3, 4, 5, 6]})


age_groups = df1.groupby(['agerange','gender'])['income'].agg(lambda x: tuple(x)).to_dict()
df2['income'] = df2.apply(lambda x: np.random.choice(age_groups[x['agerange'],x['gender']]) if (x['agerange'],x['gender']) in age_groups else 0,axis=1)

输出:

   agerange  gender  index  income
0         3       0      0   43000
1         2       0      1   25600
2         6       0      2       0
3         4       0      3  106000

答案 2 :(得分:3)

d2['income'] = d2.apply(lambda x: d1.loc[(d1.agerange==x.agerange) &(d1.gender == x.gender),'income'].sample(n=1).max(),axis=1)

输出:

   index  agerange  gender  income
0      0         3       0     200
1      1         2       0   25600
2      2         4       0    3000
3      3         4       0  106000