/ / पायथन: विभिन्न पांडा डेटा फ्रेम कॉलम के बीच औसत कैसे करें? - अजगर, पांडा, समूह द्वारा

पायथन: विभिन्न पांडा डेटा फ्रेम कॉलम के बीच औसत कैसे करें? - अजगर, पांडा, समूह द्वारा

मेरे पास निम्नलिखित डेटासेट हैं:

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