পাইথন পান্ডাস একটি ঘরে প্রবেশ করান


111

আমার একটি তালিকা আছে 'এবিসি' এবং একটি ডেটাফ্রেম 'ডিএফ':

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN

আমি তালিকাটি 1B কক্ষে sertোকাতে চাই, তাই আমি এই ফলাফলটি চাই:

    A  B
0  12  NaN
1  23  ['foo', 'bar']

হো আমি এটা করতে পারি?

1) আমি যদি এটি ব্যবহার করি:

df.ix[1,'B'] = abc

আমি নিম্নলিখিত ত্রুটি বার্তা পেয়েছি:

ValueError: Must have equal len keys and value when setting with an iterable

কারণ এটি একটি সারি / কলামে তালিকাটি সন্নিবেশ করানোর চেষ্টা করে (এতে দুটি উপাদান রয়েছে) কিন্তু কোনও ঘরে নেই।

2) আমি যদি এটি ব্যবহার করি:

df.ix[1,'B'] = [abc]

তারপরে এটি একটি তালিকা সন্নিবেশ করায় যার কেবলমাত্র একটি উপাদান রয়েছে যা 'এবিসি' তালিকা ( [['foo', 'bar']])।

3) আমি যদি এটি ব্যবহার করি:

df.ix[1,'B'] = ', '.join(abc)

তারপরে এটি একটি স্ট্রিং সন্নিবেশ করায়: ( foo, bar) তবে তালিকা নয়।

4) আমি যদি এটি ব্যবহার করি:

df.ix[1,'B'] = [', '.join(abc)]

তারপরে এটি একটি তালিকা সন্নিবেশ করায় তবে এটিতে কেবল একটি উপাদান রয়েছে ( ['foo, bar']) তবে দুটি হিসাবে নয় আমি চাই ( ['foo', 'bar'])।

সাহায্যের জন্য ধন্যবাদ!


সম্পাদনা

আমার নতুন ডেটাফ্রেম এবং পুরানো তালিকা:

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'

অন্য ডেটাফ্রেম:

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]

আমি df2.loc[1,'B']এবং / অথবা মধ্যে 'abc' তালিকাটি sertোকাতে চাই df3.loc[1,'B']

যদি ডেটাফ্রেমে কেবলমাত্র পূর্ণসংখ্যার মান এবং / অথবা NaN মান এবং / অথবা তালিকার মানগুলির সাথে কলাম থাকে তবে একটি ঘরে কোনও তালিকা সন্নিবেশ করা পুরোপুরি কার্যকর হয়। যদি ডেটাফ্রেমে কেবল স্ট্রিং মান এবং / অথবা এনএএন মান এবং / অথবা তালিকার মানগুলির সাথে কলাম থাকে তবে একটি ঘরে কোনও তালিকা সন্নিবেশ করা পুরোপুরি কার্যকর হয়। তবে যদি ডেটাফ্রেমের পূর্ণসংখ্যা এবং স্ট্রিংয়ের মান এবং অন্যান্য কলামগুলির সাথে কলাম থাকে তবে ত্রুটি বার্তা উপস্থিত হয় যদি আমি এটি ব্যবহার করি: df2.loc[1,'B'] = abcবা df3.loc[1,'B'] = abc

অন্য ডেটাফ্রেম:

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN

এই সন্নিবেশগুলি নিখুঁতভাবে কাজ করে: df.loc[1,'B'] = abcবা df4.loc[1,'B'] = abc


4
আপনি কোন সংস্করণ পান্ডা ব্যবহার করছেন? নিম্নলিখিত 0.15.0df.loc[1,'b'] = ['foo','bar']
পান্ডাস

ধন্যবাদ! আমি পাইথন ২.7 ব্যবহার করি এবং আমি 0.14.0 এবং 0.15.0 পান্ডার চেষ্টা করেছি এবং এটি উপরের পরীক্ষার ডেটা নিয়ে কাজ করেছে। তবে আমার যদি কিছু পূর্ণসংখ্যার মানগুলির সাথে 'সি' কলামও থাকে তবে কী হবে? 'এ' এর স্ট্রিং রয়েছে। একটি পূর্ণসংখ্যা কলাম এবং একটি স্ট্রিং কলামে আমি একই ত্রুটি পেয়েছি: ভ্যালুআরর: পুনরাবৃত্তের সাথে সেট করার সময় সমান লেন কী এবং মান থাকতে হবে
ragesz

আপনার অর্থ কী তা বোঝাতে এবং দেখানোর জন্য আপনাকে ডেটা এবং কোড পোস্ট করতে হবে
এডচুম

উত্তর:


131

যেহেতু set_valueহয়েছে অবচিত সংস্করণ 0.21.0 যেহেতু, আপনি এখন ব্যবহার করা উচিত at। এটা একটা উত্থাপন ছাড়াই কোনো কক্ষের মধ্যে একটি তালিকা ঢোকাতে পারবেন ValueErrorযেমন locআছে। আমি মনে করি এটি কারণ কারণ at সর্বদা একক মানকে বোঝায়, যখন locমানগুলি পাশাপাশি সারি এবং কলামগুলি উল্লেখ করতে পারে।

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z

আপনি যে কলামটি সন্নিবেশ করিয়েছেন সেটিও আপনার নিশ্চিত করতে হবে dtype=object। উদাহরণ স্বরূপ

>>> df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [1,2,3]})
>>> df.dtypes
A    int64
B    int64
dtype: object

>>> df.at[1, 'B'] = [1, 2, 3]
ValueError: setting an array element with a sequence

>>> df['B'] = df['B'].astype('object')
>>> df.at[1, 'B'] = [1, 2, 3]
>>> df
   A          B
0  1          1
1  2  [1, 2, 3]
2  3          3

4
আমাকে নিশ্চিত করতে হয়েছিল যে এটির কাজ করার জন্য মূল ডেটাফ্রেম টাইপটি আপত্তি করেছিল:df = pd.DataFrame(data, dtype=object)
তাকভার

4
একটি সূচি প্রয়োজন। আমি অন্য বৈশিষ্ট্যযুক্ত মানটির মিলটি ব্যবহার করে সারিটি কীভাবে উল্লেখ করব; উদাহরণস্বরূপ: উপরের উদাহরণে A = 2 দিয়ে সারির জন্য?
বিকাশগ

9
এটি অন্য ত্রুটি ফেরায় ValueError: setting an array element with a sequence.; আপনি যদি ত্রুটি পান তবে @ সিএস 95 এর উত্তর দেখুন।
ব্লেজার্ড

41

df3.set_value(1, 'B', abc)যে কোনও ডেটাফ্রেমের জন্য কাজ করে। 'বি' কলামের ডেটা ধরণের যত্ন নিন। যেমন একটি তালিকা একটি ফ্লোট কলামে sertedোকানো যাবে না, সেক্ষেত্রে df['B'] = df['B'].astype(object)সহায়তা করতে পারে।


6
নোট করুন যে এই আদেশটি হ্রাস করা হয়েছে । ঠিক নীচে একটি আপডেট আছে।
টমাস

36

পান্ডা> = 0.21

set_valueঅবচয় করা হয়েছে। আপনি এখন DataFrame.atলেবেল DataFrame.iatদ্বারা সেট করতে এবং পূর্ণসংখ্যার অবস্থান দ্বারা সেট করতে ব্যবহার করতে পারেন ।

at/ এর সাথে ঘর মান নির্ধারণiat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object

আপনি যদি কিছু নতুন তালিকায় "বি" এর দ্বিতীয় সারিতে একটি মান সেট করতে চান তবে ব্যবহার করুন DataFrane.at:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

আপনি ব্যবহার করে পূর্ণসংখ্যা অবস্থান দ্বারা সেট করতে পারেন DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

আমি যদি পাই ValueError: setting an array element with a sequence?

আমি এর সাথে পুনরুত্পাদন করার চেষ্টা করব:

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.

এটি কারণ আপনার কোনও বস্তুটি float64টাইপযুক্ত, যেখানে তালিকাগুলি objectগুলি রয়েছে, সুতরাং সেখানে কোনও মিল নেই। এই পরিস্থিতিতে আপনাকে যা করতে হবে তা হ'ল কলামটিকে প্রথমে অবজেক্টে রূপান্তর করা।

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object

তারপরে, এটি কাজ করে:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]

সম্ভাব্য, তবে হ্যাকি

আরও অবাস্তব, আমি খুঁজে পেয়েছি DataFrame.locযে আপনি নেস্টেড তালিকা পাস করলে অনুরূপ কিছু অর্জন করতে আপনি হ্যাক করতে পারেন ।

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]

এটি এখানে কেন কাজ করে সে সম্পর্কে আপনি আরও পড়তে পারেন


2

এই পোস্টে পান্ডে যেমন উল্লেখ করা হয়েছে : কিভাবে ডাটাফ্রেমে একটি তালিকা সংরক্ষণ করবেন? ; ডেটাফ্রেমের ডাইপ টাইপগুলি ফলাফলগুলিকে প্রভাবিত করতে পারে, পাশাপাশি ডেটাফ্রেমকে কল করতে বা বরাদ্দ করা নাও হতে পারে।


2

চারপাশে দ্রুত কাজ

নীচের ডাটা ফ্রেমে কল 2-এর মতো কেবল একটি নতুন তালিকার মধ্যে তালিকাটি বন্ধ করুন। এটি কাজ করার কারণটি হ'ল পাইথন বাইরের তালিকাটি (তালিকাগুলির) নেয় এবং এটিকে একটি কলামে রূপান্তরিত করে যেন এটিতে সাধারণ স্কেলারের আইটেম রয়েছে যা আমাদের ক্ষেত্রে তালিকা এবং সাধারণ স্কেলারগুলি নয় rs

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]

1

পাও

ValueError: Must have equal len keys and value when setting with an iterable,

.at এর পরিবর্তে .at ব্যবহার করা আমার ক্ষেত্রে কোনও তাত্পর্যপূর্ণ করেনি, তবে ডেটাফ্রেম কলামের ডেটাটাইপ প্রয়োগ করে কৌতুকটি করেছে:

df['B'] = df['B'].astype(object)

তারপরে আমি আমার ডেটাফ্রেমে তালিকাগুলি, নমপি অ্যারে এবং সমস্ত ধরণের জিনিসকে একক ঘরের মান হিসাবে সেট করতে পারি।


0

আমি একটি সমাধান পেয়েছি যা প্রয়োগ করা বেশ সহজ।

কেবলমাত্র তালিকার অবজেক্টটি মোড়ানোর জন্য একটি অস্থায়ী ক্লাস করুন এবং পরে ক্লাস থেকে মানটি কল করুন।

এখানে একটি ব্যবহারিক উদাহরণ:

  1. ধরা যাক আপনি ডেটাফ্রেমে তালিকার অবজেক্টটি সন্নিবেশ করতে চান।
df = pd.DataFrame([
    {'a': 1},
    {'a': 2},
    {'a': 3},
])

df.loc[:, 'b'] = [
    [1,2,4,2,], 
    [1,2,], 
    [4,5,6]
] # This works. Because the list has the same length as the rows of the dataframe

df.loc[:, 'c'] = [1,2,4,5,3] # This does not work. 

>>> ValueError: Must have equal len keys and value when setting with an iterable

## To force pandas to have list as value in each cell, wrap the list with a temporary class.

class Fake(object):
    def __init__(self, li_obj):
        self.obj = li_obj

df.loc[:, 'c'] = Fake([1,2,5,3,5,7,]) # This works. 

df.c = df.c.apply(lambda x: x.obj) # Now extract the value from the class. This works. 

এটি করার জন্য একটি জাল শ্রেণি তৈরি করা ঝামেলার মতো হতে পারে তবে এতে কিছু ব্যবহারিক প্রয়োগ থাকতে পারে। উদাহরণস্বরূপ আপনি applyযখন রিটার্ন মান তালিকা থাকে তখন এটি ব্যবহার করতে পারেন ।

পান্ডারা সাধারণত কোনও ঘরে কোনও তালিকা প্রবেশ করতে অস্বীকার করবে তবে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনি সন্নিবেশকে জোর করতে পারেন।

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