পান্ডাস ডেটা ফ্রেমের নতুন কলামে তালিকায় আইডি পাওয়া গেছে


11

বলুন আমার কাছে নিম্নলিখিত ডেটাফ্রেম (পূর্ণসংখ্যার কলাম এবং পূর্ণসংখ্যার তালিকার একটি কলাম) আছে ...

      ID                   Found_IDs
0  12345        [15443, 15533, 3433]
1  15533  [2234, 16608, 12002, 7654]
2   6789      [43322, 876544, 36789]

এবং আইডির একটি পৃথক তালিকা ...

bad_ids = [15533, 876544, 36789, 11111]

এটি দেওয়া হয়েছে এবং df['ID']কলাম এবং যে কোনও সূচক উপেক্ষা করে bad_idsতালিকার কোনও আইডি df['Found_IDs']কলামে উল্লেখ করা আছে কিনা তা দেখতে চাই । আমার এখন পর্যন্ত কোডটি হ'ল:

df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]

এটি কাজ করে তবে কেবল যদি bad_idsতালিকাটি ডেটাফ্রেমের চেয়ে দীর্ঘ হয় এবং আসল ডেটাসেটের জন্য bad_idsতালিকাটি ডেটাফ্রেমের চেয়ে অনেক খাটো হয়ে যায়। যদি আমি bad_idsতালিকাটি কেবলমাত্র দুটি উপাদানগুলিতে সেট করি ...

bad_ids = [15533, 876544]

আমি একটি খুব জনপ্রিয় ত্রুটি পেয়েছি (আমি একই ত্রুটি সহ অনেকগুলি প্রশ্ন পড়েছি) ...

ValueError: Length of values does not match length of index

আমি তালিকাটি সিরিজে রূপান্তর করার চেষ্টা করেছি (ত্রুটির কোনও পরিবর্তন নেই)। আমি Falseবোধগম্য রেখাটি করার আগে নতুন কলাম যুক্ত করার এবং সমস্ত মান নির্ধারণ করার চেষ্টা করেছি (আবার ত্রুটির কোনও পরিবর্তন হবে না)।

দুটি প্রশ্ন:

  1. ডেটাফ্রেমের চেয়ে সংক্ষিপ্ত তালিকাটির জন্য কীভাবে আমি আমার কোড (নীচে) পেতে পারি?
  2. df['bad_id']কলামটিতে পাওয়া সত্যিকারের আইডি (সত্য / মিথ্যা অপেক্ষা আরও কার্যকর ) লিখতে কোডটি কীভাবে পাব ?

এর জন্য প্রত্যাশিত আউটপুট bad_ids = [15533, 876544]:

      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]    True
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]    True

bad_ids = [15533, 876544](আইডি) এর জন্য আদর্শ আউটপুট একটি নতুন কলাম বা কলামে লেখা হয়:

      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]    15533
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]    876544

কোড:

import pandas as pd

result_list = [[12345,[15443,15533,3433]],
        [15533,[2234,16608,12002,7654]],
        [6789,[43322,876544,36789]]]

df = pd.DataFrame(result_list,columns=['ID','Found_IDs'])

# works if list has four elements
# bad_ids = [15533, 876544, 36789, 11111]

# fails if list has two elements (less elements than the dataframe)
# ValueError: Length of values does not match length of index
bad_ids = [15533, 876544]

# coverting to Series doesn't change things
# bad_ids = pd.Series(bad_ids)
# print(type(bad_ids))

# setting up a new column of false values doesn't change things
# df['bad_id'] = False

print(df)

df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]

print(bad_ids)

print(df)

উত্তর:


7

np.intersect1dদুটি তালিকার ছেদটি পেতে ব্যবহার :

df['bad_id'] = df['Found_IDs'].apply(lambda x: np.intersect1d(x, bad_ids))

      ID                   Found_IDs    bad_id
0  12345        [15443, 15533, 3433]   [15533]
1  15533  [2234, 16608, 12002, 7654]        []
2   6789      [43322, 876544, 36789]  [876544]

বা কেবল ভ্যানিলা পাইথন দিয়ে ছেদ ব্যবহার করে sets:

bad_ids_set = set(bad_ids)
df['Found_IDs'].apply(lambda x: list(set(x) & bad_ids_set))

3

যদি ব্যবহারের Found_IDsসমস্ত মান দ্বারা কলামে তালিকার সমস্ত মান পরীক্ষা করতে চান bad_ids:

bad_ids = [15533, 876544]

df['bad_id'] = [any(c in l for c in bad_ids) for l  in df['Found_IDs']]
print (df)
      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]    True
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]    True

যদি সমস্ত মিল চান:

df['bad_id'] = [[c for c in bad_ids if c in l] for l  in df['Found_IDs']]
print (df)
      ID                   Found_IDs    bad_id
0  12345        [15443, 15533, 3433]   [15533]
1  15533  [2234, 16608, 12002, 7654]        []
2   6789      [43322, 876544, 36789]  [876544]

এবং প্রথম ম্যাচের জন্য, যদি খালি তালিকা সেট করা থাকে False, সম্ভাব্য সমাধান, তবে বুলিয়ান এবং সংখ্যার মিশ্রণের প্রস্তাব দেওয়া হয়নি:

df['bad_id'] = [next(iter([c for c in bad_ids if c in l]), False) for l  in df['Found_IDs']]
print (df)
      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]   15533
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]  876544

সেট সহ সমাধান:

df['bad_id'] = df['Found_IDs'].map(set(bad_ids).intersection)
print (df)

      ID                   Found_IDs    bad_id
0  12345        [15443, 15533, 3433]   {15533}
1  15533  [2234, 16608, 12002, 7654]        {}
2   6789      [43322, 876544, 36789]  {876544}

এবং তালিকা অনুধাবন সঙ্গে একই:

df['bad_id'] = [list(set(bad_ids).intersection(l)) for l  in df['Found_IDs']]
print (df)
      ID                   Found_IDs    bad_id
0  12345        [15443, 15533, 3433]   [15533]
1  15533  [2234, 16608, 12002, 7654]        []
2   6789      [43322, 876544, 36789]  [876544]

1

আপনি np.any প্রয়োগ এবং ব্যবহার করতে পারেন:

df['bad_id'] = df['Found_IDs'].apply(lambda x: np.any([c in x for c in bad_ids]))

যদি আপনি এই বদ_আইডগুলি পুনরুদ্ধার করতে চান তবে ফাউন্ডড_আইডিগুলিতে একটি খারাপ_আইডির উপস্থিত থাকলে এই বিলটি ফেরত পাঠাবে:

df['bad_id'] = df['Found_IDs'].apply(lambda x: [*filter(lambda x: c in x, bad_ids)])

এটি পাওয়া_আইডে ব্যাড_আইডসের একটি তালিকা ফিরিয়ে দেবে, যদি 0 থাকে তবে এটি ফিরে আসে []


1

ব্যবহার mergeএবং concatথাকাকালীন আপনার সূচক দ্বারা গোষ্ঠীবদ্ধ সব ম্যাচ দেখাবে।

bad_ids = [15533, 876544, 36789, 11111]

df2 = pd.concat(
    [
        df,
        pd.merge(
            df["Found_IDs"].explode().reset_index(),
            pd.Series(bad_ids, name="bad_ids"),
            left_on="Found_IDs",
            right_on="bad_ids",
            how="inner",
        )
        .groupby("index")
        .agg(bad_ids=("bad_ids", list)),
    ],
    axis=1,
).fillna(False)
print(df2)


      ID                   Found_IDs          bad_ids
0  12345        [15443, 15533, 3433]          [15533]
1  15533  [2234, 16608, 12002, 7654]            False
2   6789      [43322, 876544, 36789]  [876544, 36789]

0

বিস্ফোরিত এবং গোষ্ঠী দ্বারা সমষ্টি ব্যবহার করুন

s = df['Found_IDs'].explode()
df['bad_ids'] = s.isin(bad_ids).groupby(s.index).any()

জন্য bad_ids = [15533, 876544]

>>> df
      ID                   Found_IDs  bad_ids
0  12345        [15443, 15533, 3433]     True
1  15533  [2234, 16608, 12002, 7654]    False
2   6789      [43322, 876544, 36789]     True

অথবা

মান মেলানোর জন্য

s = df['Found_IDs'].explode()
s.where(s.isin(bad_ids)).groupby(s.index).agg(lambda x: list(x.dropna()))

জন্য bad_ids = [15533, 876544]

      ID                   Found_IDs   bad_ids
0  12345        [15443, 15533, 3433]   [15533]
1  15533  [2234, 16608, 12002, 7654]        []
2   6789      [43322, 876544, 36789]  [876544]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.