मेरे पास इस तरह एक डेटाफ्रेम है:

>>> df = pd.DataFrame([['a',0,0.2],['b',0,0.3],
...                    ['c',0,0.5],
...                    ['a',1,0.4],['b',1,0.3],['c',1,0.3],
...                    ['a',2,0.5],['b',2,0.5]]
...                    ,columns=['place','ID','prob'])
>>> df
place   ID  prob
0   a   0   0.20
1   b   0   0.30
2   c   0   0.50
3   a   1   0.40
4   b   1   0.30
5   c   1   0.30
6   a   2   0.50
7   b   2   0.50

मैं प्रत्येक आईडी के भीतर पंक्तियों में से किसी एक को बेतरतीब ढंग से चुनने के लिए प्रोब कॉलम को संभाव्यता जन वितरण के रूप में उपयोग करना चाहता हूं। यानी, मैं प्रत्येक 'आईडी' के भीतर केवल एक पंक्ति का चयन करना चाहता हूं। आउटपुट इस तरह दिखेगा:

place   ID  prob    choice
0   a   0   0.20    1
1   b   0   0.30    0
2   c   0   0.50    0
3   a   1   0.40    0
4   b   1   0.30    1
5   c   1   0.30    0
6   a   2   0.50    1
7   b   2   0.50    0

वास्तविक डेटाफ़्रेम में लाखों पंक्तियाँ होंगी, इसलिए जितना अधिक कुशल होगा उतना ही बेहतर होगा। शुक्रिया!

0
Benjamin Latimer 9 सितंबर 2020, 21:45

1 उत्तर

सबसे बढ़िया उत्तर

हम आपके prob को DataFrame.sample में भार के रूप में उपयोग कर सकते हैं। हमें केवल एक GroupBy में इसका उपयोग करना है, क्योंकि हम इसे place में प्रत्येक समूह के लिए करना चाहते हैं:

sample = df.groupby("ID").apply(lambda x: x.sample(weights=x["prob"]))
choices = sample.reset_index(drop=True, level=0).index
df["choice"] = df.index.isin(choices).astype(int)

  place  ID  prob  choice
0     a   0   0.2       0
1     b   0   0.3       1
2     c   0   0.5       0
3     a   1   0.4       1
4     b   1   0.3       0
5     c   1   0.3       0
6     a   2   0.5       0
7     b   2   0.5       1
1
Erfan 9 सितंबर 2020, 22:24