2016-12-19 10 views
5

उप-शीर्षक को अनदेखा करें: इसे नीचे दबाएं, चतुर होने की कोशिश करना बंद करें।पांडा डेटा फ्रेम की कॉन्सट सूची, लेकिन कॉलम नाम

मेरे पास सिंगल-कॉलम पांडा डेटा फ्रेम की एक सूची (res) है, प्रत्येक में समान संख्यात्मक डेटा होता है, लेकिन प्रत्येक एक अलग कॉलम नाम वाला होता है। पंक्ति सूचकांक का कोई मतलब नहीं है। मैं उन्हें एक एकल, बहुत लंबा, सिंगल-कॉलम डेटा फ्रेम में रखना चाहता हूं।

जब मैं pd.concat(res) करता हूं तो मुझे एक इनपुट प्रति इनपुट फ़ाइल (और लोड और नाएन कोशिकाओं का भार) मिलता है। मैंने पैरामीटर (*) के लिए विभिन्न मानों का प्रयास किया है, लेकिन कोई भी जो मैं करता हूं उसके बाद करता हूं।

संपादित करें: नमूना डेटा: हर डेटा फ्रेम को कॉपी करें और एक नया स्तंभ नाम देने: है कि सबसे अच्छा तरीका नहीं है

newList = [] 
for r in res: 
    r.columns = ["same"] 
    newList.append(r) 
pd.concat(newList, ignore_index=True) 

निश्चित रूप से

res = [ 
    pd.DataFrame({'A':[1,2,3]}), 
    pd.DataFrame({'B':[9,8,7,6,5,4]}), 
    pd.DataFrame({'C':[100,200,300,400]}), 
] 

मैं एक बदसूरत-हैक समाधान है इसे करने के लिए??

बीटीडब्ल्यू, pandas: concat data frame with different column name समान है, लेकिन मेरा प्रश्न भी सरल है, क्योंकि मैं इंडेक्स को बनाए रखना नहीं चाहता हूं। (मैं एन सिंगल-कॉलम डेटा फ्रेम की एक सूची से भी शुरू करता हूं, न कि एक एन-कॉलम डेटा फ्रेम।)

*: उदा। axis=0 डिफ़ॉल्ट व्यवहार है। axis=1 एक त्रुटि देता है। join="inner" सिर्फ मूर्ख है (मुझे केवल सूचकांक मिलता है)। ignore_index=True इंडेक्स को किराए पर लेता है, लेकिन मुझे बहुत सारे कॉलम मिलते हैं, बहुत सारे NaNs।


खाली सूचियों के लिए अद्यतन

मैं समस्याओं (सभी दिया समाधान के साथ) हो रही थी जब डेटा एक खाली सूची थी, कुछ की तरह:

res = [ 
    pd.DataFrame({'A':[1,2,3]}), 
    pd.DataFrame({'B':[9,8,7,6,5,4]}), 
    pd.DataFrame({'C':[]}), 
    pd.DataFrame({'D':[100,200,300,400]}), 
] 

चाल के लिए गया था .astype('float64') जोड़कर, प्रकार को मजबूर करें। जैसे

pd.Series(np.concatenate([df.values.ravel().astype('float64') for df in res])) 

या:

pd.concat(res,axis=0).astype('float64').stack().reset_index(drop=True) 

उत्तर

2

मैं सूची comphrension इस तरह का प्रयोग करेंगे है:

import pandas as pd 
res = [ 
    pd.DataFrame({'A':[1,2,3]}), 
    pd.DataFrame({'B':[9,8,7,6,5,4]}), 
    pd.DataFrame({'C':[100,200,300,400]}), 
] 


x = [] 
[x.extend(df.values.tolist()) for df in res] 
pd.DataFrame(x) 

Out[49]: 
     0 
0  1 
1  2 
2  3 
3  9 
4  8 
5  7 
6  6 
7  5 
8  4 
9 100 
10 200 
11 300 
12 400 

मैं तुम्हारे लिए गति का परीक्षण किया।

%timeit x = []; [x.extend(df.values.tolist()) for df in res]; pd.DataFrame(x) 
10000 loops, best of 3: 196 µs per loop 
%timeit pd.Series(pd.concat(res, axis=1).values.ravel()).dropna() 
1000 loops, best of 3: 920 µs per loop 
%timeit pd.concat(res, axis=1).stack().reset_index(drop=True) 
1000 loops, best of 3: 902 µs per loop 
%timeit pd.DataFrame(pd.concat(res, axis=1).values.ravel(), columns=['col']).dropna() 
1000 loops, best of 3: 1.07 ms per loop 
%timeit pd.Series(np.concatenate([df.values.ravel() for df in res])) 
10000 loops, best of 3: 70.2 µs per loop 

लग रहा है

pd.Series(np.concatenate([df.values.ravel() for df in res])) 

की तरह सबसे तेज है।

+0

'pd.concat ([x.rename (कॉलम = लैम्ब्डा सी:' वही ') x में res के लिए हो सकता है], ignore_index = True) ' – jrovegno

+0

समय के लिए धन्यवाद; यह इस मामले में समय संवेदनशील नहीं था, लेकिन अगर मुझे कभी भी बड़ी मात्रा में डेटा की आवश्यकता होती है तो सबसे तेज़ मुहावरे को जानना अच्छा होता है। –

5

मुझे तुम्हारी जरूरत है लगता है concatstack साथ:

print (pd.concat(res, axis=1)) 
    A B  C 
0 1.0 9 100.0 
1 2.0 8 200.0 
2 3.0 7 300.0 
3 NaN 6 400.0 
4 NaN 5 NaN 
5 NaN 4 NaN 

print (pd.concat(res, axis=1).stack().reset_index(drop=True)) 
0  1.0 
1  9.0 
2  100.0 
3  2.0 
4  8.0 
5  200.0 
6  3.0 
7  7.0 
8  300.0 
9  6.0 
10 400.0 
11  5.0 
12  4.0 
dtype: float64 

सपाट के लिए numpy.ravel साथ एक अन्य समाधान:

print (pd.Series(pd.concat(res, axis=1).values.ravel()).dropna()) 
0  1.0 
1  9.0 
2  100.0 
3  2.0 
4  8.0 
5  200.0 
6  3.0 
7  7.0 
8  300.0 
10  6.0 
11 400.0 
13  5.0 
16  4.0 
dtype: float64 
साथ
print (pd.DataFrame(pd.concat(res, axis=1).values.ravel(), columns=['col']).dropna()) 
     col 
0  1.0 
1  9.0 
2 100.0 
3  2.0 
4  8.0 
5 200.0 
6  3.0 
7  7.0 
8 300.0 
10 6.0 
11 400.0 
13 5.0 
16 4.0 

समाधान:

print (pd.Series(np.concatenate([df.values.ravel() for df in res]))) 
0  1 
1  2 
2  3 
3  9 
4  8 
5  7 
6  6 
7  5 
8  4 
9  100 
10 200 
11 300 
12 400 
dtype: int64 
+0

उन पंक्तियों के साथ, लेकिन मेरे पास 1-कॉलम डेटा फ्रेम की एक सूची है, न कि आपके उदाहरण में 6-कॉलम डेटा फ्रेम। –

+0

@ डैरेनकूक तो 'df.values' काम नहीं करेगा? – MMF

+0

मैंने अभी प्रश्न में नमूना डेटा जोड़ा है। –

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