පැන්ඩාස් දත්ත රාමුවට එක් පේළියක් එක් කරන්න


942

පැන්ඩා නිර්මාණය කර ඇත්තේ සම්පූර්ණ ජනගහනය පැටවීම සඳහා බව මට වැටහී ඇති DataFrameනමුත් මට හිස් දත්ත රාමුවක් සෑදිය යුතු අතර පසුව පේළි එකින් එක එකතු කරන්න . මෙය කිරීමට හොඳම ක්‍රමය කුමක්ද?

මම හිස් දත්ත රාමුවක් සමඟ සාර්ථකව නිර්මාණය කළෙමි:

res = DataFrame(columns=('lib', 'qty1', 'qty2'))

එවිට මට නව පේළියක් එක් කර ක්ෂේත්‍රයක් පුරවා ගත හැකිය:

res = res.set_value(len(res), 'qty1', 10.0)

එය ක්‍රියාත්මක වන නමුත් අමුතු බවක් පෙනේ: - / (එය නූල් අගය එකතු කිරීමට අසමත් වේ)

මගේ දත්ත රාමුවට (විවිධ තීරු වර්ග සහිත) නව පේළියක් එක් කරන්නේ කෙසේද?


71
මෙය විශාල දත්ත රාමුවක් තැනීමට ඉතා අකාර්යක්ෂම ක්‍රමයක් බව සලකන්න; ඔබ පේළියක් එකතු කරන විට නව අරා සෑදිය යුතුය (පවතින දත්ත පිටපත් කිරීම).
වෙස් මැකින්නි

5
EsWesMcKinney: Thx, ඒක දැනගන්න එක හොඳයි. විශාල වගු වලට තීරු එකතු කිරීම ඉතා වේගවත්ද ?
උපරිම

4
එය ඔබට අකාර්යක්ෂම නම්, ඔබට අතිරේක පේළියක් කලින් වෙන් කර යාවත්කාලීන කරන්න.
user1154664

1
හේයි ඔබ ... ඔව්, ඔබ ... මට පෙනෙන්නේ ඔබ කුමක් කළ යුතුද යන්නයි ... ඔබට මෙය ලූපයක් තුළ ධාවනය කර හිස් දත්ත රාමුවකට පේළි එක් කිරීමට අවශ්‍යයි, එහෙම නේද ... හොඳයි, එපා ' ටී!
cs95

Answers:


629

ඔබට භාවිතා කළ හැකිය df.loc[i], එහිදී දර්ශකය සහිත පේළිය iදත්ත රාමුවේ තිබිය යුතු යැයි ඔබ නියම කරයි.

>>> import pandas as pd
>>> from numpy.random import randint

>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>>     df.loc[i] = ['name' + str(i)] + list(randint(10, size=2))

>>> df
     lib qty1 qty2
0  name0    3    3
1  name1    2    4
2  name2    2    8
3  name3    2    1
4  name4    9    6

25

34
A මැක්සිම්: වැඩි දියුණු කිරීමක් මම තරයේ නිර්දේශ කරමි. වත්මන් පැන්ඩස් අනුවාදය 0.15.0 වේ.
fred

47
.locදර්ශක තීරුව යොමු කිරීමකි, එබැවින් ඔබ 0 සිට ආරම්භ වන පූර්ණ සංඛ්‍යා වල අඛණ්ඩ අනුක්‍රමයක් නොවන දර්ශකයක් සමඟ පෙර පැවති දත්ත රාමුවක් සමඟ වැඩ කරන්නේ නම් (ඔබගේ උදාහරණයේ දී මෙන්), .locපවතින පේළි නැවත ලියයි, නැතහොත් පේළි ඇතුළත් කරයි, හෝ ඔබේ දර්ශකයේ හිඩැස් ඇති කරන්න. පවත්නා දිග නොවන දත්ත රාමුවක් එකතු කිරීම සඳහා වඩාත් ශක්තිමත් (නමුත් මෝඩ-ඔප්පු නොවන) ප්‍රවේශයක් වනුයේ: df.loc[df.index.max() + 1] = [randint(...හෝ oo ෆූබාර් යෝජනා කළ පරිදි දර්ශකය සකස් කිරීම.
හොබ්ස්

4
දත්ත ගබඩාව හිස් වූ විට @ හොබ්ස් df.index.max()වේ nan.
flow2k

8
obhobs මම සිතූ එක් විසඳුමක් වන්නේ df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
ත්‍රිමාණ

522

දත්ත රාමුව සඳහා ඔබට සියලු දත්ත පෙරට ගෙන යා හැකි නම්, දත්ත රාමුවකට එකතු වීමට වඩා වේගවත් ප්‍රවේශයක් ඇත:

  1. සෑම ශබ්ද කෝෂයක්ම ආදාන දත්ත පේළියකට අනුරූප වන ශබ්ද කෝෂ ලැයිස්තුවක් සාදන්න.
  2. මෙම ලැයිස්තුවෙන් දත්ත රාමුවක් සාදන්න.

පේළි අනුව දත්ත රාමු පේළියකට එකතු කිරීම සඳහා මිනිත්තු 30 ක් ගත වූ අතර තත්පර කිහිපයකින් නිම කරන ලද ශබ්දකෝෂ ලැයිස්තුවෙන් දත්ත රාමුවක් නිර්මාණය කිරීම මට සමාන කාර්යයක් විය.

rows_list = []
for row in input_rows:

        dict1 = {}
        # get input row in dictionary format
        # key = col_name
        dict1.update(blah..) 

        rows_list.append(dict1)

df = pd.DataFrame(rows_list)               

50
සියලු දත්ත ඉදිරියෙන් ලබා ගත නොහැකි ඕනෑම තත්වයක් සඳහා මම මෙය කිරීමට යොමු වී සිටිමි. වේග වෙනස විශ්මය ජනකයි.
මන ast කල්පිත

53
Pandas docs වෙතින් පිටපත් කිරීම: It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.( pandas.pydata.org/pandas-docs/stable/… )
thikonom

5
මෙය විශිෂ්ටයි! මම දත්ත රාමුව නිර්මාණය කළ විට හැර, තීරු නම් සියල්ලම වැරදි පිළිවෙළකට
පැවතුනි

5
case user5359531 ඔබට එම අවස්ථාවේ දී ඇණවුම් කළ විධානය භාවිතා කළ හැකිය
ශිඛාර්දුවා

21
@ user5359531 ඔබට තීරු අතින් නියම කළ හැකි අතර ඇණවුම සුරැකෙනු ඇත. pd.DataFrame (rows_list, columns = ['C1', 'C2', 'C3']) උපක්‍රමය කරනු ඇත
මාර්සෙලෝ ග්‍රෙචි ලින්ස්

295

ඔබට භාවිතා කළ හැකිය pandas.concat()හෝ DataFrame.append(). විස්තර සහ උදාහරණ සඳහා, ඒකාබද්ධ කිරීම, සම්බන්ධ වීම සහ සංයුක්ත කිරීම බලන්න .


7
හායි, ඉතින් append () හෝ concat () භාවිතා කරන ක්‍රම සඳහා පිළිතුර කුමක්ද? මට ඇත්තේ එකම ගැටලුවකි, නමුත් තවමත් එය හදුනා ගැනීමට උත්සාහ කරයි.
නොටිලස්

122
මෙය නිවැරදි පිළිතුරයි, නමුත් එය ඉතා හොඳ පිළිතුරක් නොවේ (පාහේ සබැඳිය පමණි).
jwg

5
මම හිතන්නේ @ ෆ්‍රෙඩ්ගේ පිළිතුර වඩාත් නිවැරදි ය. IIUC මෙම පිළිතුරේ ඇති ගැටළුව නම්, පේළියක් එකතු කරන සෑම අවස්ථාවකම එය අනවශ්‍ය ලෙස සම්පූර්ණ දත්ත රාමුව පිටපත් කිරීමයි. .locවළක්වා ගත හැකි යාන්ත්‍රණය භාවිතා කිරීම , විශේෂයෙන් ඔබ ප්‍රවේශම් නම්.
කෙන් විලියම්ස්

7
නමුත් ඔබට භාවිතා කිරීමට අවශ්‍ය නම් DataFrame.append(), ඔබේ පේළි දත්ත ද දත්ත රාමුවක් බව සහතික කර ගත යුතුය, ලැයිස්තුවක් නොවේ.
රැඳී සිටින්න

236

එය බොහෝ කාලයක් ගතවී ඇත, නමුත් මම ද එම ගැටලුවට මුහුණ දුන්නෙමි. මෙහි රසවත් පිළිතුරු රාශියක් හමු විය. එබැවින් කුමන ක්‍රමයක් භාවිතා කළ යුතුදැයි මට ව්‍යාකූල විය.

දත්ත රාමුවට පේළි ගොඩක් එකතු කිරීමේදී මම වේගවත් ක්‍රියාකාරිත්වය ගැන උනන්දු වෙමි . එබැවින් මම වඩාත් ජනප්‍රිය ක්‍රම 4 ක් උත්සාහ කර ඒවායේ වේගය පරීක්ෂා කළෙමි.

නව පැකේජ භාවිතා කරමින් 2019 දී යාවත්කාලීන කරන ලදි . OoFooBar අදහස් දැක්වීමෙන් පසුවද යාවත්කාලීන කරන ලදි

වේගවත් කාර්ය සාධනය

  1. .Append භාවිතා කිරීම ( NPE හි පිළිතුර )
  2. .Loc භාවිතා කිරීම (ෆ්‍රෙඩ්ගේ පිළිතුර )
  3. පූර්ව වෙන් කිරීම සමඟ .loc භාවිතා කිරීම ( ෆූබාර්ගේ පිළිතුර )
  4. ඩික්ට් භාවිතා කර අවසානයේ ඩේටා ෆ්‍රේම් සාදන්න ( ශිඛාර්දුවාගේ පිළිතුර )

ප්‍රති Results ල (තත්පර වලින්):

|------------|-------------|-------------|-------------|
|  Approach  |  1000 rows  |  5000 rows  | 10 000 rows |
|------------|-------------|-------------|-------------|
| .append    |    0.69     |    3.39     |    6.78     |
|------------|-------------|-------------|-------------|
| .loc w/o   |    0.74     |    3.90     |    8.35     |
| prealloc   |             |             |             |
|------------|-------------|-------------|-------------|
| .loc with  |    0.24     |    2.58     |    8.70     |
| prealloc   |             |             |             |
|------------|-------------|-------------|-------------|
|  dict      |    0.012    |   0.046     |   0.084     |
|------------|-------------|-------------|-------------|

ප්‍රයෝජනවත් අදහස් දැක්වීම සඳහා rasskrassowski ටද ස්තූතියි - මම කේතය යාවත්කාලීන කළෙමි.

ඒ නිසා මම ශබ්ද කෝෂය හරහා එකතු කිරීම් භාවිතා කරමි.


කේතය:

import pandas as pd
import numpy as np
import time

del df1, df2, df3, df4
numOfRows = 1000
# append
startTime = time.perf_counter()
df1 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows-4):
    df1 = df1.append( dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)

# .loc w/o prealloc
startTime = time.perf_counter()
df2 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
    df2.loc[i]  = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)

# .loc with prealloc
df3 = pd.DataFrame(index=np.arange(0, numOfRows), columns=['A', 'B', 'C', 'D', 'E'] )
startTime = time.perf_counter()
for i in range( 1,numOfRows):
    df3.loc[i]  = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df3.shape)

# dict
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
    row_list.append(dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows-4):
    dict1 = dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E'])
    row_list.append(dict1)

df4 = pd.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)

PS මම විශ්වාස කරනවා, මගේ අවබෝධය පරිපූර්ණ නොවේ, සමහර විට යම් ප්‍රශස්තිකරණයක් තිබිය හැකිය.


4
භාවිතය df2.index.max()සඳහා .locඅනවශ්ය පරිගණකමය සංකීර්ණත්වය වැඩි. සරලයි df2.loc[i] = .... මට නම් එය කාලය 10 සිට 8.64 දක්වා අඩු කර ඇත
krassowski

ඔබගේ පරීක්ෂණයෙන් ඔබ මගේ ප්‍රවේශය අනුගමනය නොකරන බැවින් කරුණාකර ලැයිස්තුවෙන් මගේ නම ඉවත් කරන්න: සුදුසු ප්‍රමාණයේ දර්ශකයක් ලබා දීමෙන් ඔබ මතකය පූර්ව වෙන් කිරීමක් නොකරයි.
ෆූබාර්

Oo ෆූබාර් හායි! කතුවරයා මගේ පිළිතුර දුටු විට මම ඔබට සතුටු වෙමි :) ඔබ හරි, මට මෙම වැදගත් කරුණ මග හැරුණි. ඔබේ ප්‍රවේශය වෙනස් ප්‍රති result ල පෙන්වන බැවින් මගේ ප්‍රති result ල වගුව සඳහා තවත් එක් පේළියක් එක් කිරීමට මම කැමැත්තෙමි!
මිහායිල්_සම්

IkMikhail_Sam වේගවත්ම ක්‍රමය භාවිතා කරමින් එක්සෙල් ගොනුවක ලිවීමට ඔබ pivot-table භාවිතා කරන්නේ කෙසේද?
FabioSpaghetti

1
පැන්ඩාස් ඩේටා ෆ්‍රේම් වෙත ආ ict ාව වඩා හොඳ ක්‍රමයක් වන්නේ ඇයිද යන්න පිළිබඳව තවත් අදහසක් ඉදිරිපත් කිරීමට අවශ්‍ය විය. වගුවේ විවිධ දත්ත වර්ග ඇති දත්ත කට්ටලයක් සමඟ මා කළ අත්හදා බැලීමේදී, පැන්ඩාස් උපග්‍රන්ථ ක්‍රම භාවිතා කිරීමෙන් යතුරු ලියනය විනාශ වන අතර, ඩික්ට් එකක් භාවිතා කිරීම සහ එයින් එක් වරක් පමණක් දත්ත රාමුව නිර්මාණය කිරීම, මුල් දත්ත සමුදායන් නොවෙනස්ව පවතින බව පෙනේ.
හොරණෑ

114

පෙර ඇතුළත් කිරීම් ගණන ඔබ දන්නේ නම්, ඔබ දර්ශකය ද ලබා දීමෙන් අවකාශය පූර්ව වෙන් කළ යුතුය (දත්ත පිළිතුර වෙනත් පිළිතුරකින් ලබා ගැනීම):

import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )

# now fill it up row by row
for x in np.arange(0, numberOfRows):
    #loc or iloc both work here since the index is natural numbers
    df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]: 
   lib  qty1  qty2
0   -1    -1    -1
1    0     0     0
2   -1     0    -1
3    0    -1     0
4   -1     0     0

වේග සංසන්දනය

In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop

සහ - අදහස් දැක්වීමේදී මෙන් - 6000 ක විශාලත්වයක් සහිතව, වේග වෙනස ඊටත් වඩා විශාල වේ:

අරාවෙහි විශාලත්වය (12) සහ පේළි ගණන (500) වැඩි කිරීමෙන් වේග වෙනස වඩාත් කැපී පෙනේ: 313ms එදිරිව 2.29s


3
නියම පිළිතුර. පේළි අවකාශය වර්ධක ලෙස වෙන් කිරීම අවශ්‍ය නොවන පරිදි මෙය සම්මතය විය යුතුය.
ely

8
අරාවෙහි විශාලත්වය (12) සහ පේළි ගණන (500) වැඩි කිරීමෙන් වේග වෙනස වඩාත් කැපී පෙනේ: 313ms vs 2.29s
Tickon

85
mycolumns = ['A', 'B']
df = pd.DataFrame(columns=mycolumns)
rows = [[1,2],[3,4],[5,6]]
for row in rows:
    df.loc[len(df)] = row

2
මෙය! මම සෑහෙන කාලයක් තිස්සේ සොයමින් සිටිමි, පේළියකට නිශ්චිත අගයන් ලබා දෙන්නේ කෙසේදැයි පෙන්වන පළමු ලිපිය මෙයයි! පාරිතෝෂික ප්‍රශ්නය: තීරු-නම / අගය යුගල සඳහා වන වාක්‍ය ඛණ්ඩය කුමක්ද? මම හිතන්නේ එය ආ ict ාවක් භාවිතා කරන දෙයක් විය යුතුයි, නමුත් මට එය නිවැරදි යැයි පෙනේ.
ජින්

5
ඔබ එය දීර් extend කරන විට එය සමස්ත දත්ත රාමුවම පිටපත් කරන බැවින් මෙය කාර්යක්ෂම නොවේ.
ජල ආරක්ෂිත

72

කාර්යක්ෂමව එකතු කිරීම සඳහා පැන්ඩාස් දත්ත රාමුවකට අමතර පේළියක් එකතු කරන්නේ කෙසේද සහ විශාල කිරීම සමඟ සැකසීම බලන්න .

හරහා පේළි එක් loc/ixමත නොවන පවතින මූලික දර්ශකයේ දත්ත. උදා:

In [1]: se = pd.Series([1,2,3])

In [2]: se
Out[2]: 
0    1
1    2
2    3
dtype: int64

In [3]: se[5] = 5.

In [4]: se
Out[4]: 
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64

හෝ:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
   .....:                 columns=['A','B'])
   .....: 

In [2]: dfi
Out[2]: 
   A  B
0  0  1
1  2  3
2  4  5

In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']

In [4]: dfi
Out[4]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
In [5]: dfi.loc[3] = 5

In [6]: dfi
Out[6]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

1
පරිශීලකයින් ක්‍රියාත්මක කිරීමට ඉල්ලා සිටියේය (නව පේළියක් එක් කරන්න). නිර්වචනය කළ දර්ශකයක පේළියක් එක් කරන්නේ කෙසේද යන්න හෝ තීරුවක් එකතු කරන්නේ කෙසේද යන්න මෙහිදී අපට පෙනේ.
ගිල්හර්ම් ෆෙලිපේ රීස්

1
ඩික් ක්‍රමයට සාපේක්ෂව මෙය ක්‍රියාත්මක වන ආකාරය පිළිබඳ ඕනෑම මිණුම් සලකුණු
ආ ict ාදායක PirateApp

මෙය සමස්ත දත්ත රාමුවම පිටපත් කරන බැවින් මෙය කාර්යක්ෂම නොවේ.
ජල ආරක්ෂිත

69

ignore_indexවිකල්පය භාවිතා කරමින් ඔබට තනි පේළියක් ශබ්ද කෝෂයක් ලෙස එකතු කළ හැකිය.

>>> f = pandas.DataFrame(data = {'Animal':['cow','horse'], 'Color':['blue', 'red']})
>>> f
  Animal Color
0    cow  blue
1  horse   red
>>> f.append({'Animal':'mouse', 'Color':'black'}, ignore_index=True)
  Animal  Color
0    cow   blue
1  horse    red
2  mouse  black

39
f.append(<stuff>)දැනට පවතින වස්තුවට සරලව එකතු කරනවාට වඩා නව වස්තුවක් නිර්මාණය කරන බව ඔබ සඳහන් කළ හැකිය , එබැවින් ඔබ ස්ක්‍රිප්ට් එකක දත්ත රාමුවකට එකතු කිරීමට උත්සාහ කරන්නේ නම්, ඔබට පැවසිය යුතුයf = f.append(<stuff>)
Blairg23

2
මෙය සිදු කිරීමට ක්‍රමයක් තිබේද?
lol

@lol අංක. github.com/pandas-dev/pandas/issues/2801 බලන්න - යටින් පවතින අරා දිගු කළ නොහැකි බැවින් ඒවා පිටපත් කළ යුතුය.
ජල ආරක්ෂිත

මම මෙම ක්‍රමයට වැඩි කැමැත්තක් දක්වන්නේ එය ඉතා SQL වැනි (දර්ශක මත අර්ථකථන මත රඳා නොපවතින) සහ හැකි සෑම විටම මම එය භාවිතා කරන බැවිනි.
ජීන් එම්

45

පයිතොනික් ක්‍රමය සඳහා, මෙන්න මගේ පිළිතුර එක් කරන්න:

res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
res = res.append([{'qty1':10.0}], ignore_index=True)
print(res.head())

   lib  qty1  qty2
0  NaN  10.0   NaN

33

දත්ත රාමුවක් වර්ධනය නොකරන්න!

ඔව්, ඔබ දැනටමත් දත්ත රාමුවක් වර්ධනය නොකළ යුතු බවත්, ඔබේ දත්ත ලැයිස්තුවකට එකතු කර අවසානයේ දත්ත රාමුවක් බවට පරිවර්තනය කළ යුතු බවත් මිනිසුන් දැනටමත් පැහැදිලි කර ඇත. නමුත් ඔබට තේරෙනවාද ඒ ඇයි?

මෙන්න මගේ ලිපියෙන් ලබාගත් වැදගත්ම හේතු මෙන්න .

  1. ලැයිස්තුවකට එකතු කිරීම සහ එකවර දත්ත රාමුවක් නිර්මාණය කිරීම සැමවිටම ලාභදායී / වේගවත් වේ.
  2. ලැයිස්තු අඩු මතකයක් ලබා ගන්නා අතර ඒවා සමඟ වැඩ කිරීමට, එකතු කිරීමට සහ ඉවත් කිරීමට වඩා සැහැල්ලු දත්ත ව්‍යුහයකි.
  3. dtypesඔබගේ දත්ත සඳහා ස්වයංක්‍රීයව අනුමාන කෙරේ. අනෙක් පැත්තෙන්, NaNs හි හිස් රාමුවක් සෑදීම ස්වයංක්‍රීයව ඒවා සාදනු ඇත object, එය නරක ය.
  4. ඔබ එකතු කරන පේළියට නිවැරදි දර්ශකය පැවරීමට ඔබ සැලකිලිමත් වීම වෙනුවට දර්ශකයක් ස්වයංක්‍රීයව ඔබ වෙනුවෙන් නිර්මාණය වේ.

ඔබේ දත්ත එක්රැස් කිරීම සඳහා මෙය නිවැරදි මාර්ගය is වේ

data = []
for a, b, c in some_function_that_yields_data():
    data.append([a, b, c])

df = pd.DataFrame(data, columns=['A', 'B', 'C'])

මෙම විකල්පයන් භයානක ය

  1. appendහෝ concatලූපයක් ඇතුළත

    appendහා concatනෛසර්ගිකව ම නරක නැහැ හුදකලාව . ගැටළුව ආරම්භ වන්නේ ඔබ ඒවා පුඩුවක් තුළට නැවත කැඳවූ විටය - මෙහි ප්‍රති results ලය වන්නේ චතුරස්රාකාර මතක භාවිතයයි.

    # Creates empty DataFrame and appends
    df = pd.DataFrame(columns=['A', 'B', 'C'])
    for a, b, c in some_function_that_yields_data():
        df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True)  
        # This is equally bad:
        # df = pd.concat(
        #       [df, pd.Series({'A': i, 'B': b, 'C': c})], 
        #       ignore_index=True)
  2. NaNs හි හිස් දත්ත රාමුව

    තීරු object(මන්දගාමී, දෛශිකකරණය කළ නොහැකි ඩයිටයිප්) සමඟ ආරම්භ කර ඇති බැවින් කිසි විටෙකත් NaNs හි දත්ත රාමුවක් සාදන්න.

    # Creates DataFrame of NaNs and overwrites values.
    df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
    for a, b, c in some_function_that_yields_data():
        df.loc[len(df)] = [a, b, c]

සාධනය පුඩිං වල ඇත

මෙම ක්‍රමවේදයන් කාලානුරූපව ඔවුන්ගේ මතකය හා උපයෝගීතාව අනුව ඒවා කොතරම් වෙනස් දැයි බැලීමට වේගවත්ම ක්‍රමයයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

යොමු කිරීම සඳහා මිණුම් සලකුණු කේතය.


මම මේ ප්‍රජාවේ කොටසක් වන්නේ මන්දැයි මට මතක් කර දෙන මෙවැනි පෝස්ට්. මිනිසුන්ට නිවැරදි පිළිතුර ලබා ගැනීම නිවැරදි කේතයෙන් නොව වැරදි කේතයකින් නිවැරදි පිළිතුර ලබා ගැනීමේ වැදගත්කම ජනතාව තේරුම් ගනී . දැන් ඔබට තර්ක කළ හැකිය එය භාවිතා කිරීම ගැටළුවක් නොවන බව locහෝ appendඔබ ඔබේ දත්ත රාමුවට එක් පේළියක් පමණක් එකතු කරන්නේ නම්. කෙසේ වෙතත්, මිනිසුන් බොහෝ විට එක් පේළියකට වඩා එකතු කිරීම සඳහා මෙම ප්‍රශ්නය දෙස බලයි - බොහෝ විට අවශ්‍ය වන්නේ ශ්‍රිතයකින් ලැබෙන දත්ත භාවිතා කරමින් ලූපයක් තුළ පේළියක් පුනරාවර්තනය කිරීමයි ( අදාළ ප්‍රශ්නය බලන්න ). එවැනි අවස්ථාවක දත්ත රාමුවක් නැවත වැඩීම හොඳ අදහසක් නොවන බව වටහා ගැනීම වැදගත්ය.


සාමාන්යයෙන් ප්රමාණවත්. ඔබට දත්ත රාමුවක් අවශ්‍ය නම් (හෝ කැමති නම්) විසඳුමක් තිබේද, නමුත් ඔබේ සියලු සාම්පල එකින් එක පැමිණේ. (සාමාන්‍යයෙන් මාර්ගගත ඉගෙනීම හෝ ක්‍රියාකාරී ඉගෙනීම)
user1657853

27

ඔබට ලැයිස්තු ලැයිස්තුවක් ගොඩනඟා එය දත්ත රාමුවක් බවට පරිවර්තනය කළ හැකිය -

import pandas as pd

columns = ['i','double','square']
rows = []

for i in range(6):
    row = [i, i*2, i*i]
    rows.append(row)

df = pd.DataFrame(rows, columns=columns)

දීම

    මම ද්විත්ව වර්ග
0 0 0 0
1 1 2 1
2 2 4 4
3 3 6 9
4 4 8 16
5 5 10 25

14

මෙය OP ප්‍රශ්නයට පිළිතුරක් නොව, ඉහත සඳහන් කළ ශිඛාර්දුවාගේ පිළිතුර නිදර්ශනය කිරීම සඳහා සෙල්ලම් උදාහරණයකි.

මෙම කැබැල්ල ඉතා සුළු වුවත්, සත්‍ය දත්තවල මා සතුව පේළි 1,000 ක් සහ බොහෝ තීරු තිබී ඇති අතර, විවිධ තීරු අනුව කාණ්ඩගත කර පහත දැක්වෙන සංඛ්‍යාලේඛන එකකට වඩා වැඩි ගණනක් සඳහා සිදු කිරීමට මම කැමැත්තෙමි. එබැවින් දත්ත රාමුව වරකට එක පේළියක් තැනීම සඳහා විශ්වාසදායක ක්‍රමවේදයක් තිබීම විශාල පහසුවකි. ස්තූතියි h ශිකාර්දුවා!

import pandas as pd 

BaseData = pd.DataFrame({ 'Customer' : ['Acme','Mega','Acme','Acme','Mega','Acme'],
                          'Territory'  : ['West','East','South','West','East','South'],
                          'Product'  : ['Econ','Luxe','Econ','Std','Std','Econ']})
BaseData

columns = ['Customer','Num Unique Products', 'List Unique Products']

rows_list=[]
for name, group in BaseData.groupby('Customer'):
    RecordtoAdd={} #initialise an empty dict 
    RecordtoAdd.update({'Customer' : name}) #
    RecordtoAdd.update({'Num Unique Products' : len(pd.unique(group['Product']))})      
    RecordtoAdd.update({'List Unique Products' : pd.unique(group['Product'])})                   

    rows_list.append(RecordtoAdd)

AnalysedData = pd.DataFrame(rows_list)

print('Base Data : \n',BaseData,'\n\n Analysed Data : \n',AnalysedData)

14

සරල හා ලස්සන ක්‍රමයක් හදුනා ගත්තා:

>>> df
     A  B  C
one  1  2  3
>>> df.loc["two"] = [4,5,6]
>>> df
     A  B  C
one  1  2  3
two  4  5  6

අදහස් දැක්වීම්වල සඳහන් පරිදි කාර්ය සාධනය සමඟ අවවාදය සටහන් කරන්න


2
මෙය මුළු දත්ත රාමුවම කබාය යටතේ පිටපත් කරන බව සලකන්න. යටින් ඇති අරා දිගු කළ නොහැකි බැවින් ඒවා පිටපත් කළ යුතුය.
ජල ආරක්ෂිත

9

ඩේටාෆ්‍රේම් නිර්මාණය කිරීම සඳහා ඔබට උත්පාදක වස්තුව භාවිතා කළ හැකිය, එය ලැයිස්තුවට වඩා මතක කාර්යක්‍ෂම වනු ඇත.

num = 10

# Generator function to generate generator object
def numgen_func(num):
    for i in range(num):
        yield ('name_{}'.format(i), (i*i), (i*i*i))

# Generator expression to generate generator object (Only once data get populated, can not be re used)
numgen_expression = (('name_{}'.format(i), (i*i), (i*i*i)) for i in range(num) )

df = pd.DataFrame(data=numgen_func(num), columns=('lib', 'qty1', 'qty2'))

පවතින දත්ත රාමුවට අමු එකතු කිරීමට ඔබට උපග්‍රන්ථ ක්‍රමය භාවිතා කළ හැකිය.

df = df.append([{ 'lib': "name_20", 'qty1': 20, 'qty2': 400  }])

8

නව වාර්තාවක් (දත්ත රාමුවක්) සාදන්න සහ old_data_frame වෙත එක් කරන්න . නව_රෙකෝඩ් (දත්ත_ රාමුවක්) නිර්මාණය කිරීම සඳහා අගයන්
ලැයිස්තුව සහ ඊට අනුරූප තීරු නම් ලබා දෙන්න.

new_record = pd.DataFrame([[0,'abcd',0,1,123]],columns=['a','b','c','d','e'])

old_data_frame = pd.concat([old_data_frame,new_record])

7

පේළියක් එක් කිරීමට / එකතු කිරීමට මාර්ගය මෙන්න pandas DataFrame

def add_row(df, row):
    df.loc[-1] = row
    df.index = df.index + 1  
    return df.sort_index()

add_row(df, [1,2,3]) 

හිස් හෝ ජනාකීර්ණ පැන්ඩා ඩේටාෆ්‍රේම් තුළ පේළියක් ඇතුළු කිරීමට / එකතු කිරීමට එය භාවිතා කළ හැකිය


1
මෙය දර්ශක සමඟ අවරෝහණ අනුපිළිවෙලට එකතු වේ
පාර්තිබන් රාජේන්ද්‍රන්

5

ශිඛාර්දුවාගේ පිළිතුරෙහි මෙන් ශබ්ද කෝෂ ලැයිස්තුවක් වෙනුවට, අපගේ වගු ලැයිස්තු ශබ්ද කෝෂයක් ලෙස නිරූපණය කළ හැකිය , එහිදී සෑම තීරුවක්ම එක් තීරුවක් පේළි පිළිවෙලට ගබඩා කරයි. අවසානයේදී අපි අපගේ දත්ත රාමුව එක් වරක් සාදන්නෙමු.

සඳහා තීරු සහ n පේළි, මෙම භාවිතා 1 ශබ්ද කෝෂය සහ ලැයිස්තු, 1, ලැයිස්තුව සහ එදිරිව n ශබ්ද කෝෂ. ශබ්ද කෝෂ ක්‍රමයේ සෑම යතුරු ගබඩාවක්ම සෑම ශබ්ද කෝෂයකම ඇති අතර සෑම පේළියකටම නව ශබ්ද කෝෂයක් නිර්මාණය කිරීම අවශ්‍ය වේ. මෙන්න අපි ලැයිස්තු වලට පමණක් එකතු වන අතර එය නියත කාලය හා න්‍යායාත්මකව ඉතා වේගවත් වේ.

# current data
data = {"Animal":["cow", "horse"], "Color":["blue", "red"]}

# adding a new row (be careful to ensure every column gets another value)
data["Animal"].append("mouse")
data["Color"].append("black")

# at the end, construct our DataFrame
df = pd.DataFrame(data)
#   Animal  Color
# 0    cow   blue
# 1  horse    red
# 2  mouse  black

4

ඔබට අවසානයේ පේළියක් එක් කිරීමට අවශ්‍ය නම් එය ලැයිස්තුවක් ලෙස එකතු කරන්න

valuestoappend = [va1,val2,val3]
res = res.append(pd.Series(valuestoappend,index = ['lib', 'qty1', 'qty2']),ignore_index = True)

3

එය කිරීමට තවත් ක්‍රමයක් (බොහෝ විට එතරම් ක්‍රියාකාරී නොවේ):

# add a row
def add_row(df, row):
    colnames = list(df.columns)
    ncol = len(colnames)
    assert ncol == len(row), "Length of row must be the same as width of DataFrame: %s" % row
    return df.append(pd.DataFrame([row], columns=colnames))

ඔබට මේ ආකාරයට DataFrame පන්තිය වැඩි දියුණු කළ හැකිය:

import pandas as pd
def add_row(self, row):
    self.loc[len(self.index)] = row
pd.DataFrame.add_row = add_row

2

ඔබට අවශ්‍ය වන්නේ loc[df.shape[0]]හෝloc[len(df)]


# Assuming your df has 4 columns (str, int, str, bool)
df.loc[df.shape[0]] = ['col1Value', 100, 'col3Value', False] 

හෝ

df.loc[len(df)] = ['col1Value', 100, 'col3Value', False] 

2
initial_data = {'lib': np.array([1,2,3,4]), 'qty1': [1,2,3,4], 'qty2': [1,2,3,4]}

df = pd.DataFrame(initial_data)

df

lib qty1    qty2
0   1   1   1
1   2   2   2
2   3   3   3
3   4   4   4

val_1 = [10]
val_2 = [14]
val_3 = [20]

df.append(pd.DataFrame({'lib': val_1, 'qty1': val_2, 'qty2': val_3}))

lib qty1    qty2
0   1   1   1
1   2   2   2
2   3   3   3
3   4   4   4
0   10  14  20

සාරධර්ම හරහා පුනරාවර්තනය කිරීම සඳහා ඔබට ලූපයක් භාවිතා කළ හැකිය, නැතහොත් අගයන් එකතු කළ හැකිය

val_1 = [10, 11, 12, 13]
val_2 = [14, 15, 16, 17]
val_3 = [20, 21, 22, 43]

df.append(pd.DataFrame({'lib': val_1, 'qty1': val_2, 'qty2': val_3}))

lib qty1    qty2
0   1   1   1
1   2   2   2
2   3   3   3
3   4   4   4
0   10  14  20
1   11  15  21
2   12  16  22
3   13  17  43

0

එය සරල කරන්න. දත්ත රාමුවේ පේළියක් ලෙස එකතු කෙරෙන ආදානය ලෙස ලැයිස්තුවක් ගැනීමෙන්: -

import pandas as pd  
res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))  
for i in range(5):  
    res_list = list(map(int, input().split()))  
    res = res.append(pd.Series(res_list,index=['lib','qty1','qty2']), ignore_index=True)

0

df.loc[subscript] = …එක් දත්ත රාමු පේළියකට පැවරීමේ ඉදිකිරීම අපි බොහෝ විට දකිමු . මිහයිල්_සෑම් විසින් මෙම ඉදිකිරීම් මෙන්ම ඩික්ට් භාවිතා කරන ක්‍රමවේදය සහ අවසානයේ ඩේටා ෆ්‍රේම් නිර්මාණය කරන මිණුම් සලකුණු පළ කරන ලදී . දෙවැන්න මෙතෙක් වේගවත්ම බව ඔහු සොයා ගත්තේය. නමුත් අපි df3.loc[i] = …ඔහුගේ කේතයේ (පූර්ව වෙන් කළ දත්ත රාමුව සමඟ) ප්‍රතිස්ථාපනය කළහොත්, ප්‍රති come ලය df3.values[i] = …සැලකිය යුතු ලෙස වෙනස් වේ, එම ක්‍රමයේදී ඩික්ට් භාවිතා කරන ක්‍රමයට සමාන වේ. එබැවින් අපි බොහෝ විට භාවිතය df.values[subscript] = …සැලකිල්ලට ගත යුතුය. කෙසේ වෙතත්, .valuesඑය ශුන්‍ය පාදක දායකත්වයක් ගන්නා බව සලකන්න , එය DataFrame.index ට වඩා වෙනස් විය හැකිය.


1
@baxx - එක කේතය උදාහරණයක් මේ අවස්ථාවේදී මේ මිනුම් දඬු ලින්ක් ( # .loc with prealloc), තවත් උදාහරණයක් ප්රශ්නය වන්නේ මම පේළි ඉතිරි දත්ත සමග Pandas DataFrame එක් එක් පේළිය දත්ත සංසන්දනය කිරීමට ඇති, හැටිත් වේගවත් කිරීම සඳහා ක්රමයක් ඇති ? සහ එහි පිළිගත් පිළිතුර.
අර්මාලි

0

pandas.DataFrame.append

DataFrame.append (ස්වයං, වෙනත්, නොසලකා හරින්න

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df.append(df2)

Ignore_index සත්‍ය ලෙස සකසා ඇති විට:

df.append(df2, ignore_index=True)

-1

මෙය හිස් දත්ත රාමුවකට අයිතමයක් එක් කිරීම ගැන සැලකිලිමත් වේ. ගැටළුව වන්නේ df.index.max() == nanපළමු දර්ශකය සඳහා:

df = pd.DataFrame(columns=['timeMS', 'accelX', 'accelY', 'accelZ', 'gyroX', 'gyroY', 'gyroZ'])

df.loc[0 if math.isnan(df.index.max()) else df.index.max() + 1] = [x for x in range(7)]

-1

පේළියක් එක් කිරීමට පෙර, අපට දත්ත රාමුව ශබ්ද කෝෂයට පරිවර්තනය කළ යුතුය, එහිදී ඔබට යතුරු දත්ත රාමුවේ තීරු ලෙස දැකිය හැකි අතර තීරු වල අගයන් නැවත ශබ්දකෝෂයේ ගබඩා කර ඇති නමුත් සෑම තීරුවකටම යතුර දත්ත රාමුවේ දර්ශක අංකය වේ. එම අදහස නිසා පහත කේතය ලිවීමට මට හැකි වේ.

df2=df.to_dict()
values=["s_101","hyderabad",10,20,16,13,15,12,12,13,25,26,25,27,"good","bad"] #this is total row that we are going to add
i=0
for x in df.columns:   #here df.columns gives us the main dictionary key
    df2[x][101]=values[i]   #here the 101 is our index number it is also key of sub dictionary
    i+=1

-1

මේ සඳහා ඔබට දත්ත රාමු දෙකක් සංයුක්ත කළ හැකිය. අක්‍ෂර දර්ශකයක් සහිත (සංඛ්‍යාත්මක නොවේ) පවතින දත්ත රාමුවට නව පේළියක් එක් කිරීමට මම මූලික වශයෙන් මෙම ගැටලුවට මුහුණ දුන්නෙමි. එබැවින්, මම නව පේළියක් සඳහා දත්ත නලයක () සහ ලැයිස්තුවේ දර්ශකයට ඇතුළත් කරමි.

new_dict = {put input for new row here}
new_list = [put your index here]

new_df = pd.DataFrame(data=new_dict, index=new_list)

df = pd.concat([existing_df, new_df])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.