पांडा डेटाफ़्रेम में एक पंक्ति सम्मिलित करें


112

मेरे पास एक डेटाफ्रेम है:

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

और मुझे पाने के लिए पहली पंक्ति [2, 3, 4] जोड़ने की आवश्यकता है:

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

मैंने कोशिश की append() औरconcat() कार्य करता है लेकिन ऐसा करने का सही तरीका नहीं मिल रहा है।

डेटाफ्रेम में श्रृंखला कैसे जोड़ें / डालें?


6
ध्यान दें कि यह उपयोग करना बेहतर है s1.valuesके रूप में करने का विरोध किया list(s1)आप एक पूरी तरह से नई सूची बनाने का हो जाएगा के रूप में उपयोग करते हुए list(s1)
13

7
मुझे समझ में नहीं आता कि हर कोई पंडों से इतना प्यार क्यों करता है, जब उसे इतना सरल होना चाहिए कि गधे में ऐसा दर्द हो और इतना धीमा।
मैटकॉकरन

जवाबों:


145

बस एक विशेष सूचकांक में पंक्ति निर्दिष्ट करें, का उपयोग करते हुए loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

और आप चाहें, जैसा चाहें:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

पंडों के प्रलेखन अनुक्रमण में देखें : इज़ाफ़ा के साथ सेटिंग


2
यदि आप इज़ाफ़ा के साथ सेट नहीं करना चाहते हैं, लेकिन
डेटाफ़्रेम के

6
शिफ्टिंग इंडेक्स ऑप्शन: df.sort ()। reset_index (drop = True)
मेलून

2
df.sort पदावनत है, df.sort_index ()
GBGOLC

1
@Piotr - यह बहुत अच्छा काम करता है, लेकिन तब क्या होता है जब आप अपने डेटा फ्रेम से किसी पंक्ति को डुप्लिकेट करना चाहते हैं, जैसे कि df.loc[-1] = df.iloc[[0]], और वह डालें? फ़्रेम एक अतिरिक्त इंडेक्स कॉलम देता है जिसमें त्रुटि होती है ValueError: cannot set a row with mismatched columns (देखें stackoverflow.com/questions/47340571/… )
ग्रोपर

5
मुझे लगता df.loc[-1] = [2, 3, 4] # adding a rowहै कि थोड़ी भ्रामक है, जैसा -1कि अंतिम पंक्ति / तत्व नहीं है, क्योंकि यह पायथन सरणियों के लिए है।
flow2k

26

निश्चित नहीं है कि आप कैसे कॉल कर रहे थे, concat()लेकिन यह तब तक काम करना चाहिए जब तक दोनों ऑब्जेक्ट एक ही प्रकार के न हों। शायद मुद्दा यह है कि आपको अपना दूसरा वेक्टर डेटाफ्रेम में डालना होगा? Df का उपयोग करना जो आपने मेरे लिए निम्नलिखित कार्यों को परिभाषित किया है:

df2 = pd.DataFrame([[2,3,4]], columns=['A','B','C'])
pd.concat([df2, df])

सर्वश्रेष्ठ उत्तर ^ :)
Cam.Davidson.Pilon

23

इसे प्राप्त करने का एक तरीका है

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

आम तौर पर, डेटाफ़्रेम को जोड़ना आसान है, श्रृंखला नहीं। आपके मामले में, चूंकि आप चाहते हैं कि नई पंक्ति "शीर्ष पर" (आईडी शुरू करने के साथ) हो, और कोई फ़ंक्शन नहीं है pd.prepend(), मैं पहले नई डेटाफ़्रेम बनाता हूं और फिर अपने पुराने को जोड़ देता हूं।

ignore_indexआपके डेटाफ़्रेम में पुराने चल रहे इंडेक्स को अनदेखा करेगा और यह सुनिश्चित करेगा कि पहली पंक्ति वास्तव में इंडेक्स के 1साथ पुनरारंभ करने के बजाय इंडेक्स से शुरू होती है 0

विशिष्ट अस्वीकरण: Cetero censeo ... पंक्तियों को जोड़ना एक काफी अक्षम ऑपरेशन है। आप प्रदर्शन के बारे में परवाह है और किसी भी तरह पहले सही (अब) सूचकांक और फिर बस के साथ एक dataframe बनाने के लिए सुनिश्चित कर सकते हैं, तो डालने dataframe में अतिरिक्त पंक्ति, आप निश्चित रूप से है कि क्या करना चाहिए। देख:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

अब तक, हमारे पास आपके पास क्या है df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

लेकिन अब आप पंक्ति को आसानी से निम्नानुसार सम्मिलित कर सकते हैं। चूंकि अंतरिक्ष का प्रचार किया गया था, इसलिए यह अधिक कुशल है।

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

यह अच्छा समाधान है, मैं डेटाफ़्रेम में श्रृंखला सम्मिलित करने का प्रयास कर रहा था। यह फिलहाल मेरे लिए काफी अच्छा है।
मेलून

मुझे सबसे आखिरी विकल्प पसंद है। यह वास्तव में मेल खाता है जो मैं वास्तव में करना चाहता हूं। शुक्रिया @FooBar!
जेड काछो

13

मैंने एक छोटा फ़ंक्शन एक साथ रखा है जो एक पंक्ति सम्मिलित करते समय थोड़ा अधिक लचीलापन देता है:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

जिसे और छोटा किया जा सकता है:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

तो आप कुछ इस तरह का उपयोग कर सकते हैं:

df = insert_row(2, df, df_new)

जहां आप सम्मिलित करना चाहते हैं 2, dfवहां अनुक्रमणिका स्थिति है df_new


7

हम उपयोग कर सकते हैं numpy.insert। इससे लचीलेपन का फायदा होता है। आपको केवल वह इंडेक्स निर्दिष्ट करना होगा जिसे आप सम्मिलित करना चाहते हैं।

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

के लिए np.insert(df.values, 0, values=[2, 3, 4], axis=0), 0 फ़ंक्शन को उस स्थान / सूचकांक को बताता है जिसे आप नए मान रखना चाहते हैं।


6

यह अत्यधिक सरल लग सकता है, लेकिन इसकी अविश्वसनीय बात यह है कि एक सरल इंसर्ट नई पंक्ति फ़ंक्शन नहीं बनाया गया है। मैंने एक नए df को मूल में जोड़ने के बारे में बहुत कुछ पढ़ा है, लेकिन मैं सोच रहा हूं कि क्या यह तेजी से होगा।

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]

क्या आपका मतलब था "एक नया डीएफ जोड़ना" या सिर्फ "एक नई पंक्ति को जोड़ना", जैसा कि आपके कोड से पता चलता है?
शाम

क्षमा करें, मेरा वाक्य स्पष्ट नहीं था। मैंने अन्य लोगों के समाधानों को पढ़ा है जो सिर्फ एक पंक्ति के साथ एक नया डेटाफ़्रेम जोड़ते हैं। लेकिन मेरे समाधान में मौजूदा डेटाफ्रेम में इसकी सिर्फ एक ही पंक्ति को अतिरिक्त डेटाफ्रेम बनाने की कोई आवश्यकता नहीं है
हारून मेलगर

6

नीचे एक अनुक्रमणिका को सॉर्ट और रीसेट किए बिना पांडा डेटाफ़्रेम में एक पंक्ति सम्मिलित करने का सबसे अच्छा तरीका होगा:

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)

आप यह क्यों कहेंगे कि यह सबसे अच्छा तरीका है?
युका

फिर उस दावे का समर्थन करने के लिए सबूत प्रदान करना अच्छा होगा, क्या आपने इसे समय दिया था?
युका

1
आप pd.isna का उपयोग सुन्न आयात करने से बचने के लिए कर सकते हैं
kato2

2

पंडों में पंक्ति जोड़ना बहुत सरल है DataFrame:

  1. अपने समान कॉलम नाम के साथ एक नियमित पायथन शब्दकोश बनाएं Dataframe;

  2. pandas.append()अपने शब्दकोश के नाम पर विधि का प्रयोग करें और पास करें, जहां .append()DataFrame उदाहरण पर एक विधि है;

  3. ignore_index=Trueअपने शब्दकोश नाम के ठीक बाद जोड़ें ।


यह शायद सबसे बेहतर विकल्प है (लगभग 2020)।
डेविड गोलेबिओस्की

1

concat()लगता है पिछली पंक्ति सम्मिलन और reindexing की तुलना में थोड़ा तेज है। मामले में किसी को दो शीर्ष दृष्टिकोण की गति के बारे में आश्चर्य होगा:

In [x]: %%timeit
     ...: df = pd.DataFrame(columns=['a','b'])
     ...: for i in range(10000):
     ...:     df.loc[-1] = [1,2]
     ...:     df.index = df.index + 1
     ...:     df = df.sort_index()

17.1 s .1 705 एमएस प्रति लूप (मतलब dev एसटीडी। 7 रन का देवता, 1 लूप प्रत्येक)

In [y]: %%timeit
     ...: df = pd.DataFrame(columns=['a', 'b'])
     ...: for i in range(10000):
     ...:     df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df])

6.53 ± 127 एमएस प्रति लूप (मतलब dev एसटीडी। 7 रन का देवता, 1 लूप प्रत्येक)


0

आप बस पंक्ति को DataFrame के अंत में जोड़ सकते हैं, और फिर अनुक्रमणिका को समायोजित कर सकते हैं।

उदाहरण के लिए:

df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()

या के concatरूप में उपयोग करें :

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

-1

पंडों के डेटा फ्रेम में सबसे सरल तरीका एक पंक्ति है:

DataFrame.loc[ location of insertion ]= list( )

उदाहरण :

DF.loc[ 9 ] = [ ´Pepe , 33, ´Japan ]

NB: आपकी सूची की लंबाई डेटा फ्रेम से मेल खाना चाहिए।


मेरे लिए चाल चली!
सैम शॉ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.