मेरे पास निम्नलिखित डेटासेट हैं:
import pandas as pd
df = pd.DataFrame({"ID1": [0, 1, 0, 2, 2, 4],
"ID2": [1, 0, 3, 4, 4, 2],
"Title": ["a", "b", "c", "d", "e", "f"],
"Weight": [3, 5, 1, 1, 5, 1]})
df
ID1 ID2 Title Weight
0 1 a 3
1 0 b 5
0 3 c 1
2 4 d 1
2 4 e 5
4 2 f 1
मैं कितनी बार जाँच करना चाहता हूँ ID
कुल आवृत्ति और भारित औसत का सहयोग और गणना करें। भारित है sum
के सहयोग से sum
का Weight
। परिणाम होना चाहिए:
df1
ID1 ID2 Total Weighted Av.
1 0 2 0.25
0 3 1 1
2 4 3 0.5
मैं गलत तरीके से गिनती कर रहा हूं कि किसके बीच सहयोग है ID1
तथा ID2
इस तरह
df.groupby(["ID1","ID2"]).size().reset_index()
उत्तर:
जवाब के लिए 0 № 1आप पहले कॉलम सॉर्ट कर सकते हैं ID1
तथा ID2
द्वारा numpy.ndarray.sort
और फिर groupby
साथ में apply
कस्टम फ़ंक्शन f
:
print df
ID1 ID2 Title Weight
0 0 1 a 3
1 1 0 b 5
2 0 3 c 1
3 2 4 d 1
4 2 4 e 5
5 4 2 f 1
id1id2 = df[["ID1","ID2"]].values
id1id2.sort(axis=1)
print id1id2
[[0 1]
[0 1]
[0 3]
[2 4]
[2 4]
[2 4]]
df[["ID1","ID2"]] = id1id2
print df
ID1 ID2 Title Weight
0 0 1 a 3
1 0 1 b 5
2 0 3 c 1
3 2 4 d 1
4 2 4 e 5
5 2 4 f 1
def f(x):
#print len(x)
#print x["Weight"].sum()
return pd.Series({"Total":len(x), "Weighted Av.": len(x) / float(x["Weight"].sum()) })
print df.groupby(["ID1","ID2"]).apply(f).reset_index()
ID1 ID2 Total Weighted Av.
0 0 1 2.0 0.250000
1 0 3 1.0 1.000000
2 2 4 3.0 0.428571
उत्तर № 2 के लिए 1
मान लीजिए आप परिभाषित करते हैं
pairs = df.apply(lambda r: (min(r.ID1, r.ID2), max(r.ID1, r.ID2)), axis=1)
फिर ये आप के सामान्यीकृत जोड़े हैं DataFrame (कम प्रथम, उच्चतर द्वितीय)। अब आप इन्हें केवल समूह बना सकते हैं, और भारित औसत पा सकते हैं:
>>> df.groupby(pairs).apply(lambda g: len(g) / float(g.Weight.sum()))
(0, 1) 0.250000
(0, 3) 1.000000
(2, 4) 0.428571
dtype: float64
अपना सटीक आवश्यक डेटाफ़्रेम प्राप्त करने के लिए, कॉलम के साथ कुछ फ़िडलिंग की आवश्यकता होती है, लेकिन यह मूल रूप से ऊपर का कोड है:
pairs = df.apply(lambda r: (min(r.ID1, r.ID2), max(r.ID1, r.ID2)), axis=1)
weighted = pd.merge(
df.groupby(pairs).apply(lambda g: len(g) / float(g.Weight.sum())).reset_index(),
df.groupby(pairs).size().reset_index(),
left_index=True,
right_index=True)
weighted["ID1"] = weighted["index_x"].apply(lambda p: p[0])
weighted["ID2"] = weighted["index_x"].apply(lambda p: p[1])
weighted["Total"] = weighted["0_x"]
weighted["Weighted Ave"] = weighted["0_y"]
weighted = weighted[["ID1", "ID2", "Total", "Weighted Ave"]]
>>> weighted
ID1 ID2 Total Weighted Ave
0 0 1 0.250000 2
1 0 3 1.000000 1
2 2 4 0.428571 3