পান্ডাস ডেটা ফ্রেম কলাম থেকে তালিকা পান


289

আমার কাছে একটি এক্সেল ডকুমেন্ট রয়েছে যা দেখতে দেখতে ..

cluster load_date   budget  actual  fixed_price
A   1/1/2014    1000    4000    Y
A   2/1/2014    12000   10000   Y
A   3/1/2014    36000   2000    Y
B   4/1/2014    15000   10000   N
B   4/1/2014    12000   11500   N
B   4/1/2014    90000   11000   N
C   7/1/2014    22000   18000   N
C   8/1/2014    30000   28960   N
C   9/1/2014    53000   51200   N

আমি তালিকা হিসাবে কলাম 1 - ক্লাস্টারের বিষয়বস্তু ফিরিয়ে দিতে সক্ষম হতে চাই, তাই আমি এটির উপর একটি লুপ চালাতে পারি এবং প্রতিটি ক্লাস্টারের জন্য একটি এক্সেল ওয়ার্কশিট তৈরি করতে পারি।

একটি তালিকাতে পুরো সারির বিষয়বস্তু ফেরানো কি সম্ভব? যেমন

list = [], list[column1] or list[df.ix(row1)]

10
পান্ডাস ডেটাফ্রেম কলামগুলি একটি পান্ডাস সিরিজ যখন আপনি এগুলি টেনে বের করেন, যা আপনি তখন .tolist()সেগুলিকে একটি অজগর তালিকায় পরিণত করার জন্য কল করতে পারেন
বেন

4
V0.24 এর পরে, .valuesঅন্তর্নিহিত নিম্পি অ্যারে অ্যাক্সেসের জন্য আর কোনও পছন্দসই পদ্ধতি হবে না। এই উত্তর দেখুন ।
cs95

গুরুত্বপূর্ণ দ্রষ্টব্য: একটি পান্ডাস সিরিজকে তালিকাতে বা নম্পপি অ্যারেতে রূপান্তর করা প্রায়শই অপ্রয়োজনীয় এবং এটি প্রায়শই ওপির ক্ষেত্রে হয় is
এএমসি

1
এছাড়াও, এ জাতীয় তুচ্ছ প্রশ্নের জন্য অতিরিক্ত দীর্ঘ উত্তর পড়ার দরকার নেই। df.to_numpy().tolist()বেশিরভাগ ব্যবহারের ক্ষেত্রে জরিমানা করা উচিত।
এএমসি

1
কেবল টাইপকাস্ট ব্যবহার করেlist(x)
পে ড্রো

উত্তর:


495

পান্ডাস ডেটা ফ্রেম কলামগুলি পান্ডাস সিরিজ যখন আপনি এগুলি টেনে আনেন, তখন আপনি সেগুলিকে x.tolist()পাইথন তালিকায় পরিণত করার জন্য কল করতে পারেন । বিকল্পভাবে আপনি এটি দিয়ে castালাই list(x)

import pandas as pd

data_dict = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
             'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(data_dict)

print(f"DataFrame:\n{df}\n")
print(f"column types:\n{df.dtypes}")

col_one_list = df['one'].tolist()

col_one_arr = df['one'].to_numpy()

print(f"\ncol_one_list:\n{col_one_list}\ntype:{type(col_one_list)}")
print(f"\ncol_one_arr:\n{col_one_arr}\ntype:{type(col_one_arr)}")

আউটপুট:

DataFrame:
   one  two
a  1.0    1
b  2.0    2
c  3.0    3
d  NaN    4

column types:
one    float64
two      int64
dtype: object

col_one_list:
[1.0, 2.0, 3.0, nan]
type:<class 'list'>

col_two_arr:
[ 1.  2.  3. nan]
type:<class 'numpy.ndarray'>

24
ডক্সের শৈলীর আশেপাশে আমি আমার মাথা পেতে পারি না, কারণ এটি প্রায় সর্বদা সরল বাক্য গঠন, যেখানে আমার বাক্য গঠন এবং উদাহরণ প্রয়োজন। উদাহরণস্বরূপ সিনট্যাক্সটি একটি সেট তৈরি করতে হবে: সেট কীওয়ার্ড এবং একটি তালিকা ব্যবহার করুন: সাথে উদাহরণস্বরূপ: alist = df.cluster.tolist ()। পান্ডা না লেখা পর্যন্ত আমি লড়াই করব। এটি সেখানে পৌঁছেছে, এখন কয়েকটি উদাহরণ রয়েছে, তবে প্রতিটি পদ্ধতির জন্য নয়।
yoshiserry

ধন্যবাদ @ বেন, দুর্দান্ত উত্তর! আপনি কি আমাকে ডেটাফ্রেম পদ্ধতি সম্পর্কে বলতে পারবেন, আমি এর আগে কখনও দেখিনি ... মনে হয় আপনি কোনও ডিনেশনারিটিকে ডিএফ-তে রূপান্তর করছেন? df = ডেটাফ্রেম (ডি)?
Yoshiserry

ডেটাফ্রেম তৈরির একটি ডিফল্ট উপায় হ'ল এটি ম্যাচিং কীগুলির সাথে অভিধানের একটি তালিকা পাস করা।
বেন

2
@Yoshiserry বেশিরভাগ সাধারণ ফাংশনগুলির বাক্য বাক্য বাক্য বাক্য তালিকাভুক্তির নীচে এখন তাদের ডকুমেন্টেশনে উদাহরণ ব্যবহার রয়েছে। আরও প্রাথমিক স্তরের উদাহরণগুলির জন্য আপনি 15 মিনিটের পান্ডা দেখতে পারেন।
সিএস 95

2
@ আমি আপনাকে এখনও এসওতে সক্রিয় থাকতে দেখিনি, আমি উল্লেখ করতে চেয়েছিলাম যে আমি এই উত্তরে একটি শালীন আকারের সম্পাদনা জমা দিয়েছি, তাই আপনি কী ভাবছেন তা আমাকে জানাতে হবে :)
এএমসি

54

এটি একটি অদ্ভুত অ্যারে প্রদান করে:

arr = df["cluster"].to_numpy()

এটি অনন্য মানের একটি অদ্ভুত অ্যারে প্রদান করে :

unique_arr = df["cluster"].unique()

দুটি অনন্য পদ্ধতির মধ্যে পার্থক্য থাকা সত্ত্বেও আপনি অনন্য ব্যবহার করতে অনন্য ব্যবহার করতে পারেন:

arr = df["cluster"].to_numpy()
unique_arr = np.unique(arr)

4

উদাহরণ রূপান্তর:

নম্পি অ্যারে -> পান্ডার ডেটা ফ্রেম -> একটি পান্ডা কলাম থেকে তালিকা

নম্পি অ্যারে

data = np.array([[10,20,30], [20,30,60], [30,60,90]])

পান্ডার ডেটা ফ্রেমে নাম্পার অ্যারে রূপান্তর করুন

dataPd = pd.DataFrame(data = data)

print(dataPd)
0   1   2
0  10  20  30
1  20  30  60
2  30  60  90

একটি পান্ডার ফ্রেমকে তালিকায় রূপান্তর করুন

pdToList = list(dataPd['2'])


1
অ্যারে তৈরি কোডটি কেন দু'বার দেখাবেন, যেন এটি সমাধানের একটি গুরুত্বপূর্ণ অংশ? এমনকি কেন আদৌ এ অ্যারে তৈরি করে? df = pd.DataFrame(data=[[10, 20, 30], [20, 30, 60], [30, 60, 90]])আরও সোজা না ? এছাড়াও, পাইথন স্টাইলের কনভেনশন অনুসরণ করে এমন ভেরিয়েবলের নাম এবং হোয়াইটস্পেস নোট করুন। একটি প্রমাণ হিসাবে তালিকা Iterate যে কি প্রমাণ করে, সঠিকভাবে? এটি একটি তালিকা?
এএমসি

2

যেহেতু এই প্রশ্নটি অনেক মনোযোগ পেয়েছে এবং আপনার কার্য সম্পাদনের বিভিন্ন উপায় রয়েছে, তাই আমাকে বেশ কয়েকটি বিকল্প উপস্থাপন করতে দিন।

সেগুলি সমস্ত উপায় দ্বারা লিংকযুক্ত;)

দিয়ে শুরু:

df
  cluster load_date budget actual fixed_price
0       A  1/1/2014   1000   4000           Y
1       A  2/1/2014  12000  10000           Y
2       A  3/1/2014  36000   2000           Y
3       B  4/1/2014  15000  10000           N
4       B  4/1/2014  12000  11500           N
5       B  4/1/2014  90000  11000           N
6       C  7/1/2014  22000  18000           N
7       C  8/1/2014  30000  28960           N
8       C  9/1/2014  53000  51200           N

সম্ভাব্য ক্রিয়াকলাপগুলির ওভারভিউ:

ser_aggCol (collapse each column to a list)
cluster          [A, A, A, B, B, B, C, C, C]
load_date      [1/1/2014, 2/1/2014, 3/1/2...
budget         [1000, 12000, 36000, 15000...
actual         [4000, 10000, 2000, 10000,...
fixed_price      [Y, Y, Y, N, N, N, N, N, N]
dtype: object


ser_aggRows (collapse each row to a list)
0     [A, 1/1/2014, 1000, 4000, Y]
1    [A, 2/1/2014, 12000, 10000...
2    [A, 3/1/2014, 36000, 2000, Y]
3    [B, 4/1/2014, 15000, 10000...
4    [B, 4/1/2014, 12000, 11500...
5    [B, 4/1/2014, 90000, 11000...
6    [C, 7/1/2014, 22000, 18000...
7    [C, 8/1/2014, 30000, 28960...
8    [C, 9/1/2014, 53000, 51200...
dtype: object


df_gr (here you get lists for each cluster)
                             load_date                 budget                 actual fixed_price
cluster                                                                                         
A        [1/1/2014, 2/1/2014, 3/1/2...   [1000, 12000, 36000]    [4000, 10000, 2000]   [Y, Y, Y]
B        [4/1/2014, 4/1/2014, 4/1/2...  [15000, 12000, 90000]  [10000, 11500, 11000]   [N, N, N]
C        [7/1/2014, 8/1/2014, 9/1/2...  [22000, 30000, 53000]  [18000, 28960, 51200]   [N, N, N]


a list of separate dataframes for each cluster

df for cluster A
  cluster load_date budget actual fixed_price
0       A  1/1/2014   1000   4000           Y
1       A  2/1/2014  12000  10000           Y
2       A  3/1/2014  36000   2000           Y

df for cluster B
  cluster load_date budget actual fixed_price
3       B  4/1/2014  15000  10000           N
4       B  4/1/2014  12000  11500           N
5       B  4/1/2014  90000  11000           N

df for cluster C
  cluster load_date budget actual fixed_price
6       C  7/1/2014  22000  18000           N
7       C  8/1/2014  30000  28960           N
8       C  9/1/2014  53000  51200           N

just the values of column load_date
0    1/1/2014
1    2/1/2014
2    3/1/2014
3    4/1/2014
4    4/1/2014
5    4/1/2014
6    7/1/2014
7    8/1/2014
8    9/1/2014
Name: load_date, dtype: object


just the values of column number 2
0     1000
1    12000
2    36000
3    15000
4    12000
5    90000
6    22000
7    30000
8    53000
Name: budget, dtype: object


just the values of row number 7
cluster               C
load_date      8/1/2014
budget            30000
actual            28960
fixed_price           N
Name: 7, dtype: object


============================== JUST FOR COMPLETENESS ==============================


you can convert a series to a list
['C', '8/1/2014', '30000', '28960', 'N']
<class 'list'>


you can convert a dataframe to a nested list
[['A', '1/1/2014', '1000', '4000', 'Y'], ['A', '2/1/2014', '12000', '10000', 'Y'], ['A', '3/1/2014', '36000', '2000', 'Y'], ['B', '4/1/2014', '15000', '10000', 'N'], ['B', '4/1/2014', '12000', '11500', 'N'], ['B', '4/1/2014', '90000', '11000', 'N'], ['C', '7/1/2014', '22000', '18000', 'N'], ['C', '8/1/2014', '30000', '28960', 'N'], ['C', '9/1/2014', '53000', '51200', 'N']]
<class 'list'>

the content of a dataframe can be accessed as a numpy.ndarray
[['A' '1/1/2014' '1000' '4000' 'Y']
 ['A' '2/1/2014' '12000' '10000' 'Y']
 ['A' '3/1/2014' '36000' '2000' 'Y']
 ['B' '4/1/2014' '15000' '10000' 'N']
 ['B' '4/1/2014' '12000' '11500' 'N']
 ['B' '4/1/2014' '90000' '11000' 'N']
 ['C' '7/1/2014' '22000' '18000' 'N']
 ['C' '8/1/2014' '30000' '28960' 'N']
 ['C' '9/1/2014' '53000' '51200' 'N']]
<class 'numpy.ndarray'>

কোড:

# prefix ser refers to pd.Series object
# prefix df refers to pd.DataFrame object
# prefix lst refers to list object

import pandas as pd
import numpy as np

df=pd.DataFrame([
        ['A',   '1/1/2014',    '1000',    '4000',    'Y'],
        ['A',   '2/1/2014',    '12000',   '10000',   'Y'],
        ['A',   '3/1/2014',    '36000',   '2000',    'Y'],
        ['B',   '4/1/2014',    '15000',   '10000',   'N'],
        ['B',   '4/1/2014',    '12000',   '11500',   'N'],
        ['B',   '4/1/2014',    '90000',   '11000',   'N'],
        ['C',   '7/1/2014',    '22000',   '18000',   'N'],
        ['C',   '8/1/2014',    '30000',   '28960',   'N'],
        ['C',   '9/1/2014',    '53000',   '51200',   'N']
        ], columns=['cluster', 'load_date',   'budget',  'actual',  'fixed_price'])
print('df',df, sep='\n', end='\n\n')

ser_aggCol=df.aggregate(lambda x: [x.tolist()], axis=0).map(lambda x:x[0])
print('ser_aggCol (collapse each column to a list)',ser_aggCol, sep='\n', end='\n\n\n')

ser_aggRows=pd.Series(df.values.tolist()) 
print('ser_aggRows (collapse each row to a list)',ser_aggRows, sep='\n', end='\n\n\n')

df_gr=df.groupby('cluster').agg(lambda x: list(x))
print('df_gr (here you get lists for each cluster)',df_gr, sep='\n', end='\n\n\n')

lst_dfFiltGr=[ df.loc[df['cluster']==val,:] for val in df['cluster'].unique() ]
print('a list of separate dataframes for each cluster', sep='\n', end='\n\n')
for dfTmp in lst_dfFiltGr:
    print('df for cluster '+str(dfTmp.loc[dfTmp.index[0],'cluster']),dfTmp, sep='\n', end='\n\n')

ser_singleColLD=df.loc[:,'load_date']
print('just the values of column load_date',ser_singleColLD, sep='\n', end='\n\n\n')

ser_singleCol2=df.iloc[:,2]
print('just the values of column number 2',ser_singleCol2, sep='\n', end='\n\n\n')

ser_singleRow7=df.iloc[7,:]
print('just the values of row number 7',ser_singleRow7, sep='\n', end='\n\n\n')

print('='*30+' JUST FOR COMPLETENESS '+'='*30, end='\n\n\n')

lst_fromSer=ser_singleRow7.tolist()
print('you can convert a series to a list',lst_fromSer, type(lst_fromSer), sep='\n', end='\n\n\n')

lst_fromDf=df.values.tolist()
print('you can convert a dataframe to a nested list',lst_fromDf, type(lst_fromDf), sep='\n', end='\n\n')

arr_fromDf=df.values
print('the content of a dataframe can be accessed as a numpy.ndarray',arr_fromDf, type(arr_fromDf), sep='\n', end='\n\n')

সিএস 95 দ্বারা নির্দেশিত হিসাবে অন্যান্য পদ্ধতিগুলি এখানে দেখুন দেখুন পান্ডাস.values সংস্করণ 0.24 থেকে পান্ডাস বৈশিষ্ট্যের চেয়ে বেশি পছন্দ করা উচিত । আমি এটি এখানে ব্যবহার করি, কারণ বেশিরভাগ লোকের (2019) এখনও পুরানো সংস্করণ থাকবে, যা নতুন প্রস্তাবনাগুলিকে সমর্থন করে না। আপনি আপনার সংস্করণ দিয়ে পরীক্ষা করতে পারেনprint(pd.__version__)


1

যদি আপনার কলামে কেবল একটি মান থাকে তবে এর মতো কিছু pd.series.tolist()ত্রুটি ঘটায়। গ্যারান্টি দিতে যে এটি সমস্ত ক্ষেত্রে কাজ করবে, নীচের কোডটি ব্যবহার করুন:

(
    df
        .filter(['column_name'])
        .values
        .reshape(1, -1)
        .ravel()
        .tolist()
)

-1

এক্সেল শিটটি পড়ার পরে ডেটাফ্রেমের নামটি ধরে dfনেওয়া, একটি খালি তালিকা নিন (উদাহরণস্বরূপ dataList), সারিবদ্ধভাবে ডেটাফ্রেম সারিতে পুনরাবৃত্তি করুন এবং আপনার খালি তালিকায় যুক্ত করুন যেমন-

dataList = [] #empty list
for index, row in df.iterrows(): 
    mylist = [row.cluster, row.load_date, row.budget, row.actual, row.fixed_price]
    dataList.append(mylist)

অথবা,

dataList = [] #empty list
for row in df.itertuples(): 
    mylist = [row.cluster, row.load_date, row.budget, row.actual, row.fixed_price]
    dataList.append(mylist)

না, আপনি যদি এটি মুদ্রণ করেন তবে আপনি dataListপ্রতিটি সারি একটিতে তালিকা হিসাবে পাবেন dataList


পরিবর্তনশীল এবং ফাংশন নামের lower_case_with_underscoresশৈলী অনুসরণ করা উচিত । এই সমাধানটি হ'ল বিদ্যমানগুলির চেয়ে আরও কী কী সুবিধা অর্জন করতে পারে? এছাড়াও, আমি সিরিজ এবং ডেটাফ্রেমে অ্যাট্রিবিউট-স্টাইল অ্যাক্সেসের ব্যবহারকে নিরুৎসাহিত করি।
এএমসি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.