2015-05-19 10 views
5

मेरे पास 2 डेटाफ्रेम हैं। मैं एक विभाजन आपरेशन प्रसारित करने के लिएकिसी अन्य द्वारा एक पांडस डेटाफ्रेम को विभाजित करें - इंडेक्स को अनदेखा करें लेकिन कॉलम का सम्मान करें

df1= pd.DataFrame([[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]], 
        columns=['A','B','C','D'], index=['x','y','z']) 

df2= pd.DataFrame([[0.,1.,2.,3.]], columns=['A','B','D','C'], index=['q']) 

सूचना है कि कॉलम df2 में कुछ अलग तरह अनुरूप हैं चाहते हैं।

मैं df1 को df2 से विभाजित करना चाहता हूं जहां पंक्ति प्रसारित की जाती है लेकिन स्तंभ लेबल का सम्मान किया जाता है।

A B C D 
x 1 2 3 4 
y 5 6 7 8 
z 9 10 11 12 


    A B D C 
q 0 1 2 3 

यह गलत होगा।

df1.values/df2.values 

[[   inf 2.   1.5   1.33333333] 
[   inf 6.   3.5   2.66666667] 
[   inf 10.   5.5   4.  ]] 

उत्तर मैं इच्छा है:

A B C  D 
x inf 2 1  2 
y inf 6 2.33 4 
z inf 10 3.66 6 

उत्तर

2

काम करेगा आप, पांडा पहले dataframe के स्तंभों पर इस श्रृंखला संरेखित होगा, वांछित परिणाम दे रही है (का चयन है कि दूसरी dataframe में से एक पंक्ति से) एक श्रृंखला से विभाजित हैं:

In [75]: df1/df2.loc['q'] 
Out[75]: 
    A B   C D 
x inf 2 1.000000 2 
y inf 6 2.333333 4 
z inf 10 3.666667 6 

यदि आप उस पंक्ति के नाम का उपयोग नहीं करना चाहते हैं, तो आप एक कॉलम डेटाफ्रेम को श्रृंखला में परिवर्तित करने के लिए squeeze का उपयोग कर सकते हैं: df1/df2.squeeze() (@EdChum का उत्तर देखें)।

+0

बहुत अच्छा और संक्षिप्त +1 – EdChum

1

हो सकता है, तो आप अपने df2 कॉलम df1 का एक ही आदेश सकता है और मूल्यों पर विभाजित

In [53]: df1.values/df2[df1.columns].values 
Out[53]: 
array([[   inf, 2.  , 1.  , 2.  ], 
     [   inf, 6.  , 2.33333333, 4.  ], 
     [   inf, 10.  , 3.66666667, 6.  ]]) 
1

आप स्तंभ को पुन: व्यवस्थित कर सकते हैं और उसके बाद सरणी को फ़्लैट करने के लिए squeeze पर कॉल करें और फिर div पर कॉल करें:

In [114]: 

df1= pd.DataFrame([[1.,2.,3.,4.],[5.,6.,7.,8.],[9.,10.,11.,12.]] ,columns = ['A','B','C','D'], index = ['x','y','z']) 
df2= pd.DataFrame([[0.,1.,2.,3.]] ,columns = ['A','B','D','C'], index = ['q']) ​ 
df1.div(df2.ix[:,df1.columns].squeeze()) 

Out[114]: 
    A B   C D 
x inf 2 1.000000 2 
y inf 6 2.333333 4 
z inf 10 3.666667 6 

df1/df2.ix[:,df1.columns].squeeze() भी लेकिन काम करता है @ जोरिस का जवाब बहुत अच्छे है

संपादित

रूप @joris द्वारा बताया स्तंभ पुनर्व्यवस्था अनावश्यक है के रूप में पांडा स्वाभाविक रूप से वैसे भी तो कॉलम के खिलाफ संरेखित होगा:

df1.div(df2squeeze()) 

या

df1./df2squeeze() 

+0

मुझे सिखाने के लिए धन्यवाद। स्क्वीज़() – Dickster

+1

@EdChum आपको 'div' का उपयोग करते समय '.ix [:, df1.columns]' भाग की आवश्यकता नहीं है, क्योंकि यह इंडेक्स को स्वचालित रूप से संरेखित करता है: बस 'df1.div (df2.squeeze()) 'साथ ही साथ काम करता है (जो भी एक अच्छा समाधान है!) – joris

+1

@ जोरिस हाँ इस पर विचार कर रहा था, मुझे थोड़ा बहुत पसंद है, अपडेट होगा, धन्यवाद – EdChum

संबंधित मुद्दे

 संबंधित मुद्दे