පැන්ඩා ඩේටාෆ්‍රේම් තීරු ශීර්ෂයන්ගෙන් ලැයිස්තුව ලබා ගන්න


1040

පැන්ඩාස් ඩේටා ෆ්‍රේම් වෙතින් තීරු ශීර්ෂ ලැයිස්තුවක් ලබා ගැනීමට මට අවශ්‍යය. දත්ත රාමුව පැමිණෙන්නේ පරිශීලක ආදානයෙනි, එබැවින් තීරු කීයක් තිබේද යන්න හෝ ඒවා හඳුන්වන්නේ කුමක් දැයි මම නොදනිමි.

උදාහරණයක් ලෙස, මට මේ ආකාරයට දත්ත රාමුවක් ලබා දෙන්නේ නම්:

>>> my_dataframe
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

මට මේ වගේ ලැයිස්තුවක් ලබා ගැනීමට අවශ්‍යයි:

>>> header_list
['y', 'gdp', 'cap']

ඔබට භාවිතා කල හැකි python3.5 සිට + [*df]වැඩි list(df)හෝ df.columns.tolist()මෙම ස්තුති වන අතර, විහිදු සාමාන්යකරණයන් (පී 448) .
cs95

Answers:


1685

කිරීමෙන් ඔබට ලැයිස්තුවක් ලෙස අගයන් ලබා ගත හැකිය:

list(my_dataframe.columns.values)

ඔබට සරලව භාවිතා කළ හැකිය: ( එඩ් චුම්ගේ පිළිතුරෙහි පෙන්වා ඇති පරිදි ):

list(my_dataframe)

43
මෙම ලේඛනයටcolumns ලක්ෂණයක් නොමැති වන්නේ ඇයි ?
ටෝජ්රිමෝරි

J ටෝජ්රිමෝරි: මට විශ්වාස නෑ, එය ඔවුන්ගේ ලේඛන ස්වයංක්‍රීයව ජනනය කරන ආකාරය සමඟ සම්බන්ධ විය හැකිය. එය වෙනත් ස්ථානවල සඳහන් කර ඇත: pandas.pydata.org/pandas-docs/stable/…
සිමියොන් වීසර්

8
මම ඒ වගේ දෙයක් බලාපොරොත්තු වෙනවා df.column_names(). මෙම පිළිතුර තවමත් නිවැරදි ද නැතිනම් යල් පැන ගිය එකක් ද?
අල්වාස්

1
ඇල්වස් එය කිරීමට වෙනත් විවිධ ක්‍රම තිබේ (මෙම පිටුවේ වෙනත් පිළිතුරු බලන්න) නමුත් මා දන්නා පරිදි ලැයිස්තුව සැකසීමට දත්ත රාමුවේ කෙලින්ම ක්‍රමයක් නොමැත.
සිමියොන් වීසර්

19
වැදගත් වන්නේ, මෙය තීරු අනුපිළිවෙල ආරක්ෂා කරයි.
වින්ඩ්චයිම්ස්

415

වඩාත්ම ක්‍රියාකාරී වන බිල්ට් ඉන් ක්‍රමයක් ඇත:

my_dataframe.columns.values.tolist()

.columnsදර්ශකයක් .columns.valuesනැවත ලබා දෙයි, අරාවක් .tolistලබා දෙන අතර ලැයිස්තුවක් ආපසු ලබා දීමට මෙය උපකාරක ශ්‍රිතයක් ඇත.

කාර්ය සාධනය ඔබට එතරම් වැදගත් නොවේ නම්, Indexවස්තූන් .tolist()ඔබට කෙලින්ම ඇමතිය හැකි ක්‍රමයක් නිර්වචනය කරයි :

my_dataframe.columns.tolist()

කාර්ය සාධනයේ වෙනස පැහැදිලිය:

%timeit df.columns.tolist()
16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df.columns.values.tolist()
1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

ටයිප් වෛර කරන අය සඳහා, ඔබ ඇමතිය හැකි listමත df, වන පරිදි:

list(df)

92

සමහර ඉක්මන් පරීක්ෂණ සිදු කර ඇති අතර සමහර විට පුදුමයට කරුණක් නම් බිල්ට් අනුවාදය භාවිතා dataframe.columns.values.tolist()කිරීම වේගවත්ම වේ:

In [1]: %timeit [column for column in df]
1000 loops, best of 3: 81.6 µs per loop

In [2]: %timeit df.columns.values.tolist()
10000 loops, best of 3: 16.1 µs per loop

In [3]: %timeit list(df)
10000 loops, best of 3: 44.9 µs per loop

In [4]: % timeit list(df.columns.values)
10000 loops, best of 3: 38.4 µs per loop

(මම තවමත් ඇත්තෙන්ම කැමතියි list(dataframe), එබැවින් ස්තූතියි එඩ්චම්!)


49

එය ඊටත් වඩා සරල වේ (පැන්ඩා 0.16.0 අනුව):

df.columns.tolist()

ඔබට හොඳ ලැයිස්තුවක තීරු නම් ලබා දෙනු ඇත.


38
>>> list(my_dataframe)
['y', 'gdp', 'cap']

නිදොස් කිරීමේ මාදිලියේ සිටියදී දත්ත රාමුවක තීරු ලැයිස්තුගත කිරීම සඳහා, ලැයිස්තු අවබෝධයක් භාවිතා කරන්න:

>>> [c for c in my_dataframe]
['y', 'gdp', 'cap']

මාර්ගය වන විට, ඔබට සරලව භාවිතා කිරීමෙන් වර්ග කළ ලැයිස්තුවක් ලබා ගත හැකිය sorted:

>>> sorted(my_dataframe)
['cap', 'gdp', 'y']

එය ක්‍රියාත්මක list(df)වන්නේ ස්වයංක්‍රීයව සැකසුම් දත්ත රාමු සමඟ පමණක්ද? නැතහොත් එය සියලු දත්ත රාමු සඳහා ක්‍රියා කරයිද?
අල්වාස්

2
සියල්ලන්ටම වැඩ කළ යුතුය. කෙසේ වෙතත්, ඔබ නිදොස්කරණයෙහි සිටින විට, ඔබ ලැයිස්තු අවබෝධයක් භාවිතා කළ [c for c in df]යුතුය.
ඇලෙක්සැන්ඩර්

33

පුදුමයට කරුණක් නම් මෙය මෙතෙක් පළ කර ඇති ආකාරය මා දැක නැත, එබැවින් මම මෙය මෙහි තබමි.

විස්තාරණය කළ නොහැකි ඉවත් කිරීම (python3.5 +): [*df]සහ මිතුරන්

පයිතන් 3.5 සමඟ මුදා හැරීමේ සාමාන්‍යකරණයන් (PEP 448) හඳුන්වා දී ඇත. එබැවින්, පහත සඳහන් මෙහෙයුම් සියල්ලම කළ හැකිය.

df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x 

ඔබට අවශ්‍ය නම් list....

[*df]
# ['A', 'B', 'C']

නැතහොත්, ඔබට අවශ්‍ය නම් set,

{*df}
# {'A', 'B', 'C'}

නැතහොත්, ඔබට අවශ්‍ය නම් tuple,

*df,  # Please note the trailing comma
# ('A', 'B', 'C')

නැතහොත්, ඔබට ප්‍රති result ලය කොහේ හෝ ගබඩා කිරීමට අවශ්‍ය නම්,

*cols, = df  # A wild comma appears, again
cols
# ['A', 'B', 'C']

... ඔබ කෝපි යතුරු ලියන ශබ්ද බවට පරිවර්තනය කරන ආකාරයේ පුද්ගලයෙක් නම්, මෙය ඔබේ කෝපි වඩාත් කාර්යක්ෂමව පරිභෝජනය කරයි;)

PS: කාර්ය සාධනය වැදගත් නම්, ඔබට ඉහත විසඳුම් වාසිදායක ලෙස බැහැර කිරීමට අවශ්‍ය වනු ඇත

df.columns.to_numpy().tolist()
# ['A', 'B', 'C']

මෙය එඩ් චුම්ගේ පිළිතුරට සමානය, නමුත් v0.24 සඳහා යාවත්කාලීන කර ඇති අතර එහිදී .to_numpy()භාවිතයට වඩාත් සුදුසු වේ .values. වැඩි විස්තර සඳහා මෙම පිළිතුර (මා විසින්) බලන්න .

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

print(*df)
A B C

print(*df, sep='\n')
A
B
C

වෙනත් ක්‍රම විවේචනය කිරීම

forතනි පේළියකින් කළ හැකි මෙහෙයුමක් සඳහා පැහැදිලි පුඩුවක් භාවිතා නොකරන්න (ලැයිස්තු අවබෝධය හරි).

ඊළඟට, භාවිතා sorted(df) කිරීම තීරුවල මුල් අනුපිළිවෙල ආරක්ෂා නොකරයි . ඒ සඳහා ඔබ list(df)ඒ වෙනුවට භාවිතා කළ යුතුය .

ඊළඟට, list(df.columns)සහ list(df.columns.values)දුර්වල යෝජනා වේ (වර්තමාන අනුවාදය අනුව, v0.24). Index(ආපසු පැමිණියේ df.columns) සහ NumPy අරා දෙකම (ආපසු එවනු ලැබුවේ df.columns.values) .tolist()ක්‍රමය අර්ථ දක්වන්නේ වේගවත් හා වඩා මුග්ධ ලෙසිනි.

අවසාන වශයෙන්, ලැයිස්තුගත කිරීම එනම්, list(df)පයිතන් <= 3.4 සඳහා ඉහත සඳහන් කළ ක්‍රමවේදයන්ට සංක්ෂිප්ත විකල්පයක් ලෙස පමණක් භාවිතා කළ යුතුය.


25

එය ලබා ගත හැකිය my_dataframe.columns.


1
සහ පැහැදිලිවම ලැයිස්තුවක් ලෙසheader_list = list(my_dataframe.columns)
yeliabsalohcin

^ නැත්නම් වඩා හොඳ තවමත්: df.columns.tolist().
cs95

19

ඩේටා ෆ්‍රේම් එකක් අනුගමනය කරන්නේ වස්තූන්ගේ “යතුරු” හරහා පුනරාවර්තනය කිරීමේ ආ ict ාවයි .

my_dataframe.keys()

යතුරු / තීරු ලැයිස්තුවක් සාදන්න - වස්තු ක්‍රමය to_list()සහ පයිතොනික් ක්‍රමය

my_dataframe.keys().to_list()
list(my_dataframe.keys())

ඩේටා ෆ්‍රේම් හි මූලික ක්‍රියාකාරීත්වය තීරු ලේබල ලබා දෙයි

[column for column in my_dataframe]

තීරු ලේබල ලබා ගැනීම සඳහා දත්ත රාමුවක් ලැයිස්තුවක් බවට පරිවර්තනය නොකරන්න. පහසු කේත සාම්පල සොයන අතරතුර සිතීම නතර නොකරන්න.

xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))
list(xlarge) #compute time and memory consumption depend on dataframe size - O(N)
list(xlarge.keys()) #constant time operation - O(1)

2
මගේ පරීක්ෂණ ප්‍රදර්ශනය df.columnsවඩා වේගවත් ය df.keys(). ඔවුන් එකම දේ සඳහා ශ්‍රිතයක් සහ ගුණාංගයක් ඇත්තේ මන්දැයි නිශ්චිතවම කිව නොහැක (හොඳයි, මම පැන්ඩා වල යමක් කිරීමට විවිධ ක්‍රම 10 ක් දුටු පළමු අවස්ථාව මෙය නොවේ).
cs95

1
මගේ පිළිතුරේ අභිප්‍රාය වූයේ දත්ත රාමුවකින් තීරු ලේබල විමසීමට ක්‍රම කිහිපයක් පෙන්වීම සහ කාර්ය සාධන විරෝධී රටාවක් ඉස්මතු කිරීමයි. එසේ වුවද මම ඔබේ අදහස් වලට කැමතියි සහ ඔබේ මෑත පිළිතුර ඉහළට ඔසවා තැබුවෙමි - ඒවා මෘදුකාංග ඉංජිනේරු දෘෂ්ටි කෝණයකින් වටිනාකමක් ලබා දෙන බැවින්.
සාෂා ගොට්ෆ්‍රයිඩ්

18

එය සිත්ගන්නාසුළු නමුත් df.columns.values.tolist()3 ගුණයකින් වේගවත් df.columns.tolist()නමුත් මම සිතුවේ ඒවා එක හා සමාන බවයි:

In [97]: %timeit df.columns.values.tolist()
100000 loops, best of 3: 2.97 µs per loop

In [98]: %timeit df.columns.tolist()
10000 loops, best of 3: 9.67 µs per loop

2
මෙම පිළිතුරෙහි වේලාවන් දැනටමත් ආවරණය කර ඇත . විෂමතාවයට හේතුව එයයි.values වන්නේ යටින් පවතින අංකිත අරාව නැවත ලබා දීම සහ පැන්ඩා සමඟ එකම දේ කෙලින්ම කරනවාට වඩා අංකනය සමඟ යමක් කිරීම සෑම විටම පාහේ වේගවත් වීමයි.
cs95

14

සටහන් පොතේ

IPython නෝට්බුක්හි දත්ත ගවේෂණය සඳහා, මගේ ප්‍රියතම ක්‍රමය මෙයයි:

sorted(df)

එමඟින් අකාරාදී පිළිවෙලට ඇණවුම් කළ ලැයිස්තුවක් පහසුවෙන් කියවිය හැකිය.

කේත ගබඩාවක

කේතයෙන් මට එය වඩාත් පැහැදිලිව පෙනේ

df.columns

මන්ද එය ඔබගේ කේතය කියවන අනෙක් අයට ඔබ කරන දේ පවසන බැවිනි.


sorted(df)අනුපිළිවෙල වෙනස් කරයි. ප්‍රවේශමෙන් භාවිතා කරන්න.
cs95

oldcoldspeed මම මෙය සඳහන් කරන්නේ "අකාරාදී පිළිවෙලට ඇණවුම් කළ ලැයිස්තුවක් පහසුවෙන් කියවිය හැකි" ලෙසිනි.
firelynx

10
%%timeit
final_df.columns.values.tolist()
948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
list(final_df.columns)
14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.columns.values)
1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit
final_df.columns.tolist()
12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
list(final_df.head(1).columns)
163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

3

සිමියොන් වීසර් පිළිතුරු දුන් පරිදි ... ඔබට කළ හැකිය

list(my_dataframe.columns.values) 

හෝ

list(my_dataframe) # for less typing.

නමුත් මම හිතන්නේ බොහෝ මිහිරි ස්ථානය මෙයයි:

list(my_dataframe.columns)

එය පැහැදිලිය, ඒ සමඟම අනවශ්‍ය ලෙස දිගු නොවේ.


"එය පැහැදිලිය, ඒ සමඟම අනවශ්‍ය ලෙස දිගු නොවේ." මම එකඟවෙන්නේ නැහැ. කරන මා ෙවත පවරා listඔබ එය ඉල්ලා ඇති නම් හැරෙන්නට කිසිදු කුසලතා ඇති df(උදාහරණයක් ලෙස, සඳහා, විවිධ ක්රිඩයා) යනු සෘජු. ප්රවිශ්ඨ .columnsවිශේෂණය වූ නැවත Indexසතුව වස්තුව tolist()එය මත අර්ථ ක්රමය, සහ මා ෙවත පවරා ඇති listifying වඩා සෙන්දගශයෙහි බව Index. සම්පුර්ණත්වය උදෙසා මෝඩයන් මිශ්‍ර කිරීම හොඳ අදහසක් නොවේ. ඔබට ලැබෙන අරාව ලැයිස්තුගත කිරීම සඳහා ද එයම වේ .values.
cs95

3

ඉක්මන්, පිළිවෙලට, දෘශ්‍ය පරීක්‍ෂණයක් සඳහා මෙය උත්සාහ කරන්න:

for col in df.columns:
    print col

3

මෙය අපට ලැයිස්තුවක ඇති තීරු නම් ලබා දෙයි:

list(my_dataframe.columns)

Tolist () නමින් තවත් ශ්‍රිතයක් භාවිතා කළ හැකිය:

my_dataframe.columns.tolist()

මෙය දැනටමත් වෙනත් පිළිතුරු වලින් ආවරණය කර ඇත. ඔබේ පළමු විසඳුම මෝඩයන් ද මිශ්‍ර කරයි, එය හොඳ අදහසක් නොවේ. වෙනත් පිළිතුරක් යටතේ මගේ අදහස බලන්න .
cs95

2

ප්‍රශ්නය අතිරේක පැහැදිලි කිරීමක් අවශ්‍ය යැයි මට හැඟේ.

Ixfixxxer සඳහන් කළ පරිදි, පිළිතුර ඔබේ ව්‍යාපෘතියේ ඔබ භාවිතා කරන පැන්ඩා අනුවාදය මත රඳා පවතී. ඔබට pd.__version__විධාන සමඟ ලබා ගත හැකි .

ඔබ මා වැනි කිසියම් හේතුවක් නිසා (ඩෙබියන් ජෙසී මත මම 0.14.1 භාවිතා කරමි) 0.16.0 ට වඩා පැරණි පැන්ඩා අනුවාදය භාවිතා කරන්නේ නම්, ඔබ භාවිතා කළ යුත්තේ:

df.keys().tolist() නැති නිසා df.columns තවමත් ක්‍රමයක් ක්‍රියාත්මක කර නොමැති බැවිනි.

මෙම යතුරු ක්‍රමයේ ඇති වාසිය නම්, එය පැන්ඩා වල නවතම අනුවාදයේ පවා ක්‍රියාත්මක වන නිසා එය වඩාත් විශ්වීය ය.


යතුරු වල කේතය () යනු එය ගුණාංග සෙවීමකට වඩා ක්‍රියාකාරී ඇමතුමකි, එබැවින් එය සැමවිටම මන්දගාමී වනු ඇත. ඇත්ත වශයෙන්ම, නිරන්තර කාල ප්‍රවේශයන් සමඟ, කිසිවෙකු මෙවැනි වෙනස්කම් ගැන සැබවින්ම තැකීමක් නොකරයි, නමුත් එය කෙසේ හෝ සඳහන් කිරීම වටී යැයි මම සිතමි; df.columns දැන් ශීර්ෂයන්ට ප්‍රවේශ වීම සඳහා වඩාත් පිළිගත් මෝඩකමකි.
cs95

1
n = []
for i in my_dataframe.columns:
    n.append(i)
print n

6
කරුණාකර එය ලැයිස්තු අවබෝධයකින් ආදේශ කරන්න.
සාෂා ගොට්ෆ්‍රයිඩ්

4
ඔබේ පළමු පේළි 3 ලෙස වෙනස් කරන්න[n for n in dataframe.columns]
ඇන්ටන් ප්‍රොටොපොපොව්

ඔබට එක පේළියකින් පහසුවෙන් කළ හැකි මෙහෙයුමක් සඳහා මේ සියලු කරදරවලින් මිදීමට ඔබට අවශ්‍ය ඇයි?
cs95

0

ඉහත දක්වා ඇති විසඳුම හොඳයි. Frame.column_names () වැනි දෙයක් පැන්ඩා වල ශ්‍රිතයක් වනු ඇතැයි මම අපේක්ෂා කරමි, නමුත් එය එසේ නොවන බැවින් සමහර විට පහත සඳහන් වාක්‍ය ඛණ්ඩය භාවිතා කිරීම සතුටක් වනු ඇත. එය කෙසේ හෝ "ටොලිස්ට්" ශ්‍රිතය ඇමතීමෙන් ඔබ නිසි ආකාරයෙන් පැන්ඩා භාවිතා කරයි යන හැඟීම ආරක්ෂා කරයි: frame.columns.tolist ()

frame.columns.tolist() 

0

දත්ත රාමුවට දර්ශකයක් හෝ බහු ඉන්ඩෙක්ස් එකක් තිබේ නම් සහ ඒවා තීරු නම් ලෙස ඇතුළත් කිරීමට අවශ්‍ය නම්:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

එවැනි සරල මෙහෙයුමක් සඳහා අනවශ්‍ය කාර්ය සාධනයක් ඇති reset_index () ඇමතීමෙන් එය වළක්වයි.

දත්ත රාමු දර්ශකය ප්‍රාථමික / අද්විතීය යතුරකට සිතියම් ගත කරන දත්ත සමුදායන්ගෙන් දත්ත වසා දැමීම නිසා මට මෙය බොහෝ විට අවශ්‍ය වේ, නමුත් ඇත්ත වශයෙන්ම එය මට තවත් "තීරුවක්" පමණි. පැන්ඩාට මේ වගේ දෙයක් සඳහා ගොඩනංවන ක්‍රමයක් තිබීම අර්ථවත් වනු ඇත (මුළුමනින්ම මට එය මග හැරී ඇත).


-1

මෙම විසඳුම මඟින් ඔබේ වස්තුවේ සියලුම තීරු my_dataframe ලැයිස්තුගත කරයි:

print(list(my_dataframe))
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.