मेरे पास दो डेटाफ्रेम हैं

df1 में, मुझे लोगों को दी गई आईडी का एक आदेश मिला है, प्रत्येक व्यक्ति के पास अधिकतम 2 आईडी हो सकती हैं:

Df1

id1      id2
2040     0
2041     2050
2042     0
2043     0
2044     2051
2045     2052

df2 में, मुझे इन लोगों के लिए भुगतान और आईडी की एक सूची मिली है, लेकिन व्यवस्था नहीं की गई है:

Df2

id      amount
2040     10
2040     10
2053     5
2043     5
2052     10
2045     5

मैं जो खोज रहा हूं वह एक df3 बनाने का एक तरीका है जो एक से अधिक बार भुगतान करने वाले व्यक्ति की संभावना को ध्यान में रखते हुए df1 के विशिष्ट क्रम में भुगतान व्यवस्थित करता है: उदाहरण:

Df3

id1      id2      payment    
2040     0         20          
2041     2050      0            
2042     0         0            
2043     0         5            
2044     2051      0            
2045     2052      15           

और df4 यदि df2 में कोई आईडी है जो भविष्य में सुधार के लिए df1 में मौजूद नहीं है

Df4

id     amount
2053   5

अग्रिम में धन्यवाद।

1
Tomas Arias 15 फरवरी 2021, 00:10
1
मेरा सुझाव है कि आप पुनर्विचार करें। क्या ऐसा कुछ है जो payment1 और payment2 को मौलिक रूप से अलग बनाता है? यदि नहीं, तो विभिन्न स्तंभों के साथ उनका प्रतिनिधित्व करने का कोई मतलब नहीं है। यदि एक ग्राहक एक ही वस्तु की 10000 खरीदारी करता है, तो आपके पास उदाहरण के लिए अधिकतर शून्य का मोटा डेटाफ़्रेम होगा
 – 
anon01
15 फरवरी 2021, 00:15
मुझे लगता है कि वास्तव में मेरे पास केवल एक भुगतान कॉलम हो सकता है और वहां मूल्य जोड़ सकते हैं और यदि इसकी आवश्यकता है, तो केवल कच्चा डेटा लें और देखें कि कौन भुगतान करता है। मैं सवाल संपादित करूंगा।
 – 
Tomas Arias
15 फरवरी 2021, 00:22
ऐसा करने का यह एक अधिक सामान्य तरीका होगा। क्या आप बता सकते हैं कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं?
 – 
anon01
15 फरवरी 2021, 00:23
आप df3 के साथ जो करना चाहते हैं वह एक साधारण मर्ज है। इसे newdf3 = pd.merge(df1, df2, on='id') द्वारा प्राप्त किया जा सकता है। df4 में दूसरे बिट के लिए stackoverflow.com/questions/28901683/…
 – 
Nirbhay Tandon
15 फरवरी 2021, 00:27
1
धन्यवाद! मैं यहाँ थोड़ी देर के लिए दुबका रहा हूँ हाहाहा
 – 
Tomas Arias
15 फरवरी 2021, 00:54

1 उत्तर

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

अपडेट किया गया : Dataframe.replace

df3 = df1.assign(payment=df1.replace(df2.groupby('id')['amount'].sum())
                            .where(df1.isin(df2['id'].tolist()))
                            .sum(axis=1))  

%%timeit
df3 = df1.assign(payment=df1.replace(df2.groupby('id')['amount'].sum())
                            .where(df1.isin(df2['id'].tolist())).sum(axis=1))  
4.37 ms ± 500 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
df3 = df1.assign(payment=df1.reset_index().melt('index')
                            .assign(value=lambda x: x.value.map(df2.groupby('id')['amount']
                                                                   .sum()))
                            .groupby('index')['value'].sum())
8.83 ms ± 1.95 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

मुझे DataFrame.melt< का इस्तेमाल करना पसंद है /a> क्योंकि हम df1 में स्तंभों की संख्या पर निर्भर नहीं हैं

df3 = df1.assign(payment=df1.reset_index().melt('index')
                            .assign(value=lambda x: x.value.map(df2.groupby('id')
                                                                   .amount
                                                                   .sum()))
                            .groupby('index')['value'].sum())
print(df3)

    id1   id2  payment
0  2040     0     20.0
1  2041  2050      0.0
2  2042     0      0.0
3  2043     0      5.0
4  2044  2051      0.0
5  2045  2052     15.0

और df4:

df4 = df2.merge(df1.melt(), 
                left_on='id', 
                right_on='value', 
                indicator=True, 
                how='left')\
    .loc[lambda x: x._merge=='left_only', df2.columns]

print(df4)

     id  amount
2  2053       5
0
ansev 15 फरवरी 2021, 01:12