পান্ডাস / পাইথনের ডেটাফ্রেমে পাঠ্যের দুটি কলাম একত্রিত করুন


485

পাইথনে প্যান্ডাস ব্যবহার করে আমার কাছে 20 x 4000 ডেটা ফ্রেম রয়েছে। এর মধ্যে দুটি কলামের নাম দেওয়া হয়েছে Yearএবং quarter। আমি একটি পরিবর্তনশীল নামক তৈরি করতে চান তা periodকরে নির্মিত হয় Year = 2000এবং quarter= q2মধ্যে 2000q2

কেউ কি এই সাহায্য করতে পারেন?

উত্তর:


527

যদি উভয় কলাম স্ট্রিং হয় তবে আপনি সরাসরি তাদের সাথে একত্রীকরণ করতে পারেন:

df["period"] = df["Year"] + df["quarter"]

যদি কলামগুলির একটি (বা উভয়) টাইপ না করে থাকে তবে প্রথমে আপনার (সেগুলি) রূপান্তর করা উচিত,

df["period"] = df["Year"].astype(str) + df["quarter"]

এটি করার সময় NaN থেকে সাবধান থাকুন!


যদি আপনার একাধিক স্ট্রিং কলামগুলিতে যোগদান করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন agg:

df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)

যেখানে "-" বিভাজক।


13
সমস্ত কলামগুলি টাইপ না করে একসাথে একাধিক কলাম যুক্ত করা সম্ভব? add(dataframe.iloc[:, 0:10])উদাহরণস্বরূপ বলা যাক ?
হাইজেনবার্গ

5
@ হাইজেনবার্গ পাইথন অন্তর্নির্মিত দ্বারা এটি সম্ভব হওয়া উচিত sum
সিলভাদো

6
@ সিলভাদো আপনি দয়া করে একাধিক কলাম যুক্ত করার জন্য একটি উদাহরণ তৈরি করতে পারেন? আপনাকে ধন্যবাদ
c1c1c1

6
সতর্কতা অবলম্বন করুন, আপনাকে প্রথমে স্ট্রিং না থাকা সমস্ত কলামে মানচিত্র (স্ট্র) প্রয়োগ করতে হবে। ত্রৈমাসিকের একটি সংখ্যা হলে আপনি dataframe["period"] = dataframe["Year"].map(str) + dataframe["quarter"].map(str)মানচিত্রটি করবেন কেবল সমস্ত এন্ট্রিতে স্ট্রিং রূপান্তর প্রয়োগ করা।
ওজগুর ওজটুর্ক

13
এই সমাধানটি সমস্যা তৈরি করতে পারে iy আপনার ন্যান মান রয়েছে, এবং সাবধান

269
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
df['period'] = df[['Year', 'quarter']].apply(lambda x: ''.join(x), axis=1)

এই ডেটাফ্রেমের ফলন দেয়

   Year quarter  period
0  2014      q1  2014q1
1  2015      q2  2015q2

এই পদ্ধতিটি df[['Year', 'quarter']]আপনার ডেটাফ্রেমের কোনও কলামের স্লাইস প্রতিস্থাপন করে স্ট্রিং কলামগুলির একটি স্বেচ্ছাসেবী সংখ্যায় সাধারণীকরণ করে egdf.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1)

আপনি এখানে প্রয়োগ () পদ্ধতি সম্পর্কে আরও তথ্য পরীক্ষা করতে পারেন


20
lambda x: ''.join(x)ঠিক ''.join, না?
ডিএসএম

6
@ ওজগুর ওজটুর্ক: মুল বক্তব্যটি হ'ল নির্মাণের ল্যাম্বদা অংশটি lambda x: ''.join(x)কিছুই করে না; এটি ন্যায়বিচারের lambda x: sum(x)পরিবর্তে ব্যবহার করার মতো sum
ডিএসএম

4
একই ফলাফল নিশ্চিত যখন ব্যবহার ''.join, অর্থাত্: df['period'] = df[['Year', 'quarter']].apply(''.join, axis=1)
ম্যাক্স ঘেনিস

1
@ আর্চি joinকেবল strপুনরাবৃত্তিযোগ্য ক্ষেত্রে উদাহরণ গ্রহণ করে । mapএগুলিকে সবগুলিতে রূপান্তর করতে একটি ব্যবহার করুন strএবং তারপরে ব্যবহার করুন join
জন স্ট্রুড

16
'-'। join (x.map (str))
মনজুল

257

ছোট ডেটা-সেট (<150 ক্রস)

[''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]

বা সামান্য ধীর কিন্তু আরও কমপ্যাক্ট:

df.Year.str.cat(df.quarter)

বড় ডেটা সেট (> 150 ক্রোস)

df['Year'].astype(str) + df['quarter']

আপডেট: সময় গ্রাফ পান্ডাস 0.23.4

এখানে চিত্র বর্ণনা লিখুন

আসুন এটি 200 কে সারি ডিএফ পরীক্ষা করুন:

In [250]: df
Out[250]:
   Year quarter
0  2014      q1
1  2015      q2

In [251]: df = pd.concat([df] * 10**5)

In [252]: df.shape
Out[252]: (200000, 2)

হালনাগাদ: পান্ডাস 0.19.0 ব্যবহার করে নতুন সময়

সিপিইউ / জিপিইউ অপ্টিমাইজেশন ছাড়াই সময় নির্ধারণ (দ্রুত থেকে ধীরে ধীরে সাজানো):

In [107]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 131 ms per loop

In [106]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 161 ms per loop

In [108]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 189 ms per loop

In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 567 ms per loop

In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 584 ms per loop

In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 24.7 s per loop

সিপিইউ / জিপিইউ অপ্টিমাইজেশন ব্যবহারের সময় :

In [113]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 53.3 ms per loop

In [114]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 65.5 ms per loop

In [115]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 79.9 ms per loop

In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 9.38 s per loop

@ অ্যান্টন-ভিবিআর দ্বারা উত্তর অবদান


আপনার সময় অনুযায়ী 261 এবং 264 এর মধ্যে পার্থক্য কী?
আন্তন প্রোটোপোপভ

@ অ্যান্টনপ্রোটোপোভোভ স্পষ্টতই কোথাও থেকে 100 মাইল দূরে :)
ডেনিস গোলোমাজভ

@ অ্যান্টনপ্রোটোপোপভ, আমার ধারণা এটি দুটি সময়ের সংমিশ্রণ - একটি ব্যবহৃত সিপিইউ / জিপিইউ অপ্টিমাইজেশন, অন্যটি তা করেনি। আমি আমার উত্তর আপডেট করেছি এবং উভয় টাইমিং সেট সেখানে
রেখেছি

.Sum () এর এই ব্যবহার ব্যর্থ হয় যদি সমস্ত কলামগুলি দেখে মনে হয় তারা পূর্ণসংখ্যা হতে পারে (অর্থাত্ পূর্ণসংখ্যার স্ট্রিং ফর্ম)। পরিবর্তে, দেখে মনে হচ্ছে পান্ডগুলি সংখ্যার আগে তাদের আবার সংখ্যায় রূপান্তরিত করে!
সিপিবিএল

@ সিপিবিএল, এই পদ্ধতির চেষ্টা করে দেখুন:df.T.apply(lambda x: x.str.cat(sep=''))
ম্যাক্সইউ

157

অ্যাক্সেসরের পদ্ধতিটি cat()এর.str জন্য সত্যই ভাল কাজ করে:

>>> import pandas as pd
>>> df = pd.DataFrame([["2014", "q1"], 
...                    ["2015", "q3"]],
...                   columns=('Year', 'Quarter'))
>>> print(df)
   Year Quarter
0  2014      q1
1  2015      q3
>>> df['Period'] = df.Year.str.cat(df.Quarter)
>>> print(df)
   Year Quarter  Period
0  2014      q1  2014q1
1  2015      q3  2015q3

cat() এমনকি আপনাকে বিভাজক যুক্ত করার অনুমতি দেয় সুতরাং উদাহরণস্বরূপ, ধরুন আপনার কাছে কেবল বছর এবং সময়কালের জন্য পূর্ণসংখ্যা রয়েছে, আপনি এটি করতে পারেন:

>>> import pandas as pd
>>> df = pd.DataFrame([[2014, 1],
...                    [2015, 3]],
...                   columns=('Year', 'Quarter'))
>>> print(df)
   Year Quarter
0  2014       1
1  2015       3
>>> df['Period'] = df.Year.astype(str).str.cat(df.Quarter.astype(str), sep='q')
>>> print(df)
   Year Quarter  Period
0  2014       1  2014q1
1  2015       3  2015q3

একাধিক কলামে যোগদান কেবল সিরিজের তালিকা বা একটি ডেটাফ্রেম যা কেবলমাত্র প্রথম কলামে প্যারামিটার হিসাবে str.cat()প্রথম কলামে রয়েছে (সিরিজ) যাচাইয়ের বিষয় :

>>> df = pd.DataFrame(
...     [['USA', 'Nevada', 'Las Vegas'],
...      ['Brazil', 'Pernambuco', 'Recife']],
...     columns=['Country', 'State', 'City'],
... )
>>> df['AllTogether'] = df['Country'].str.cat(df[['State', 'City']], sep=' - ')
>>> print(df)
  Country       State       City                   AllTogether
0     USA      Nevada  Las Vegas      USA - Nevada - Las Vegas
1  Brazil  Pernambuco     Recife  Brazil - Pernambuco - Recife

মনে রাখবেন যে যদি আপনার পান্ডাস ডেটাফ্রেম / সিরিজের নাল মান থাকে তবে আপনাকে একটি পংক্তির সাহায্যে NaN মানগুলি প্রতিস্থাপন করতে na_rep প্যারামিটারটি অন্তর্ভুক্ত করতে হবে, অন্যথায় সম্মিলিত কলামটি ডিএনএনে ডিফল্ট হবে।


12
এটি এর চেয়ে ভাল মনে হয় (সম্ভবত আরও দক্ষ, খুব) lambdaবা এর চেয়ে বেশি map; এছাড়াও এটি সর্বাধিক পরিষ্কারভাবে পড়ে reads
ডোয়ান্ডারসন

1
@ জাকস, প্রথম প্যারামিটার হিসাবে সিরিজের পরিবর্তে অবশিষ্ট কলামগুলিকে ডেটাফ্রেম হিসাবে পাস করে str.cat()। আমি উত্তরটি সংশোধন করব
লিওরোকল

আপনি পান্ডার কোন সংস্করণ ব্যবহার করছেন? আমি ভ্যালুএরার পেয়েছি: আপনি কি একটি sepকীওয়ার্ড সরবরাহ করার অর্থ দিয়েছিলেন ? পান্ডাস -২.২৩.৪ এ। ধন্যবাদ!
কিনকিং লিউ

@ কিনকিংলিউ, আমি এগুলি পান্ডাস -২.২৩.৪ দিয়ে পুনরায় প্রকাশ করেছি এবং তারা মনে হয় এটি কার্যকর। sepপ্যারামিটারটি কেবল তখনই প্রয়োজনীয় যদি আপনি সংক্ষিপ্ত স্ট্রিংয়ের অংশগুলি পৃথক করতে চান। আপনি যদি কোনও ত্রুটি পান তবে দয়া করে আপনার ব্যর্থতার উদাহরণটি আমাদের দেখান।
লিওরোকেল

31

এইবার স্ট্রিং.ফোর্ম্যাট () সহ একটি লাম্বা ফাংশন ব্যবহার করুন।

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': ['q1', 'q2']})
print df
df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
print df

  Quarter  Year
0      q1  2014
1      q2  2015
  Quarter  Year YearQuarter
0      q1  2014      2014q1
1      q2  2015      2015q2

এটি আপনাকে অ-স্ট্রিং এবং প্রয়োজন অনুসারে পুনরায় ফর্ম্যাটগুলির সাথে কাজ করতে দেয়।

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': [1, 2]})
print df.dtypes
print df

df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}q{}'.format(x[0],x[1]), axis=1)
print df

Quarter     int64
Year       object
dtype: object
   Quarter  Year
0        1  2014
1        2  2015
   Quarter  Year YearQuarter
0        1  2014      2014q1
1        2  2015      2015q2

1
অনেক দ্রুততর: .apply (। '' এ যোগদান (x) অক্ষ = 1)
ঘানেম

19

আপনার প্রশ্নের সহজ উত্তর।

    year    quarter
0   2000    q1
1   2000    q2

> df['year_quarter'] = df['year'] + '' + df['quarter']

> print(df['year_quarter'])
  2000q1
  2000q2

3
যদি Yearস্ট্রিং না হয় তবে ব্যর্থ হবে
49-

4
ব্যবহারdf['Year'].astype(str) + '' + df['quarter'].astype(str)
ইয়েদরাব

2
এই সমাধানটির মূল বিষয়টি কী, কারণ এটি শীর্ষ উত্তরের সাথে অভিন্ন?
এএমসি

14

যদিও @silvado উত্তর ভাল যদি আপনি পরিবর্তন হয় df.map(str)থেকে df.astype(str)এটি দ্রুত হবে:

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})

In [131]: %timeit df["Year"].map(str)
10000 loops, best of 3: 132 us per loop

In [132]: %timeit df["Year"].astype(str)
10000 loops, best of 3: 82.2 us per loop

12

আমাদের আপনার অনুমান করা যাক dataframeহয় dfকলাম সহ Yearএবং Quarter

import pandas as pd
df = pd.DataFrame({'Quarter':'q1 q2 q3 q4'.split(), 'Year':'2000'})

মনে করুন আমরা ডেটাফ্রেমটি দেখতে চাই;

df
>>>  Quarter    Year
   0    q1      2000
   1    q2      2000
   2    q3      2000
   3    q4      2000

অবশেষে, নীচের মত Yearএবং একত্রিত করুন Quarter

df['Period'] = df['Year'] + ' ' + df['Quarter']

আপনি এখন print df ফলাফল ডেটা ফ্রেম দেখতে পারেন ।

df
>>>  Quarter    Year    Period
    0   q1      2000    2000 q1
    1   q2      2000    2000 q2
    2   q3      2000    2000 q3
    3   q4      2000    2000 q4

আপনি যদি বছর এবং ত্রৈমাসিকের মধ্যে স্থানটি না চান তবে কেবল এটি করে সরান;

df['Period'] = df['Year'] + df['Quarter']

3
স্ট্রিং হিসাবে নির্দিষ্ট করা হয়েছেdf['Period'] = df['Year'].map(str) + df['Quarter'].map(str)
স্টুবারটি

আমি TypeError: Series cannot perform the operation +যখন হয় চালাচ্ছি df2['filename'] = df2['job_number'] + '.' + df2['task_number']বা পাচ্ছি df2['filename'] = df2['job_number'].map(str) + '.' + df2['task_number'].map(str)
কার্ল বাকের

তবে, df2['filename'] = df2['job_number'].astype(str) + '.' + df2['task_number'].astype(str)কাজ করেছেন।
কার্ল বাকের

@ কার্লবেকার, আমি মনে করি আপনার ইনপুটটিতে স্ট্রিং নেই। তবে আমি আনন্দিত যে আপনি এটি বুঝতে পেরেছিলেন। dataframeআমি উপরে যে উদাহরণটি তৈরি করেছি তা যদি আপনি দেখে থাকেন তবে আপনি দেখতে পাবেন যে সমস্ত কলামগুলি stringএস।
স্যামুয়েল এনডি

এই সমাধানটির মূল বিষয়টি কী, কারণ এটি শীর্ষ উত্তরের সাথে অভিন্ন?
এএমসি

10

এখানে একটি বাস্তবায়ন যা আমি খুব বহুমুখী মনে করি:

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([[0, 'the', 'quick', 'brown'],
   ...:                    [1, 'fox', 'jumps', 'over'], 
   ...:                    [2, 'the', 'lazy', 'dog']],
   ...:                   columns=['c0', 'c1', 'c2', 'c3'])

In [3]: def str_join(df, sep, *cols):
   ...:     from functools import reduce
   ...:     return reduce(lambda x, y: x.astype(str).str.cat(y.astype(str), sep=sep), 
   ...:                   [df[col] for col in cols])
   ...: 

In [4]: df['cat'] = str_join(df, '-', 'c0', 'c1', 'c2', 'c3')

In [5]: df
Out[5]: 
   c0   c1     c2     c3                cat
0   0  the  quick  brown  0-the-quick-brown
1   1  fox  jumps   over   1-fox-jumps-over
2   2  the   lazy    dog     2-the-lazy-dog

অবগতির জন্য এই পদ্ধতি পাইথন 3 সাথে সুন্দরভাবে কাজ করে, কিন্তু পাইথন 2. আমাকে কষ্ট দেয়
অ্যালেক্স পি মিলার


9

আরও দক্ষ হয়

def concat_df_str1(df):
    """ run time: 1.3416s """
    return pd.Series([''.join(row.astype(str)) for row in df.values], index=df.index)

এবং এখানে একটি সময় পরীক্ষা:

import numpy as np
import pandas as pd

from time import time


def concat_df_str1(df):
    """ run time: 1.3416s """
    return pd.Series([''.join(row.astype(str)) for row in df.values], index=df.index)


def concat_df_str2(df):
    """ run time: 5.2758s """
    return df.astype(str).sum(axis=1)


def concat_df_str3(df):
    """ run time: 5.0076s """
    df = df.astype(str)
    return df[0] + df[1] + df[2] + df[3] + df[4] + \
           df[5] + df[6] + df[7] + df[8] + df[9]


def concat_df_str4(df):
    """ run time: 7.8624s """
    return df.astype(str).apply(lambda x: ''.join(x), axis=1)


def main():
    df = pd.DataFrame(np.zeros(1000000).reshape(100000, 10))
    df = df.astype(int)

    time1 = time()
    df_en = concat_df_str4(df)
    print('run time: %.4fs' % (time() - time1))
    print(df_en.head(10))


if __name__ == '__main__':
    main()

চূড়ান্ত, যখন sum(concat_df_str2) ব্যবহার করা হয়, ফলাফলটি কেবল কনক্যাট হয় না, এটি পূর্ণসংখ্যায় রূপান্তরিত হয়।


+1 পরিষ্কার সমাধান, এটি আমাদের কলামগুলি নির্দিষ্ট করার অনুমতি দেয়: যেমন df.values[:, 0:3]বা df.values[:, [0,2]]
তুষার বরফ করা

9

একাধিক কলামে সাধারণীকরণ, কেন নয়:

columns = ['whatever', 'columns', 'you', 'choose']
df['period'] = df[columns].astype(str).sum(axis=1)

দেখতে দুর্দান্ত লাগছে তবে আমি যদি '-' এর মতো স্ট্রিংগুলির মধ্যে একটি সীমানি যুক্ত করতে চাই তবে কী হবে?
ওডিসিও

@Odisseo এই উত্তরটি দেখুন stackoverflow.com/questions/19377969/...
geher

6

ব্যবহার zipআরও দ্রুত হতে পারে:

df["period"] = [''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]

চিত্রলেখ:

এখানে চিত্র বর্ণনা লিখুন

import pandas as pd
import numpy as np
import timeit
import matplotlib.pyplot as plt
from collections import defaultdict

df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})

myfuncs = {
"df['Year'].astype(str) + df['quarter']":
    lambda: df['Year'].astype(str) + df['quarter'],
"df['Year'].map(str) + df['quarter']":
    lambda: df['Year'].map(str) + df['quarter'],
"df.Year.str.cat(df.quarter)":
    lambda: df.Year.str.cat(df.quarter),
"df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)":
    lambda: df.loc[:, ['Year','quarter']].astype(str).sum(axis=1),
"df[['Year','quarter']].astype(str).sum(axis=1)":
    lambda: df[['Year','quarter']].astype(str).sum(axis=1),
    "df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)":
    lambda: df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1),
    "[''.join(i) for i in zip(dataframe['Year'].map(str),dataframe['quarter'])]":
    lambda: [''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]
}

d = defaultdict(dict)
step = 10
cont = True
while cont:
    lendf = len(df); print(lendf)
    for k,v in myfuncs.items():
        iters = 1
        t = 0
        while t < 0.2:
            ts = timeit.repeat(v, number=iters, repeat=3)
            t = min(ts)
            iters *= 10
        d[k][lendf] = t/iters
        if t > 2: cont = False
    df = pd.concat([df]*step)

pd.DataFrame(d).plot().legend(loc='upper center', bbox_to_anchor=(0.5, -0.15))
plt.yscale('log'); plt.xscale('log'); plt.ylabel('seconds'); plt.xlabel('df rows')
plt.show()

6

সহজ সমাধান:

জেনেরিক সমাধান

df['combined_col'] = df[['col1', 'col2']].astype(str).apply('-'.join, axis=1)

প্রশ্ন নির্দিষ্ট সমাধান

df['quarter_year'] = df[['quarter', 'year']].astype(str).apply(''.join, axis=1)

.Join এর আগে উদ্ধৃতিগুলির মধ্যে পছন্দসই ডিলিমিটার নির্দিষ্ট করুন



5

এই সমাধানটিতে মানগুলির তালিকা সহ একক কলামে ডেটাফ্রেমের দুটি কলাম সংক্ষেপিত মধ্যবর্তী পদক্ষেপ ব্যবহার করা হয় । এটি কেবল স্ট্রিংয়ের জন্যই নয়, সমস্ত ধরণের কলাম-টাইপগুলির জন্য কাজ করে

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
df['list']=df[['Year','quarter']].values.tolist()
df['period']=df['list'].apply(''.join)
print(df)

ফলাফল:

   Year quarter        list  period
0  2014      q1  [2014, q1]  2014q1
1  2015      q2  [2015, q2]  2015q2

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

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

এই সমাধানটি বিভিন্ন dtype সহ দুটি কলাম একত্রিত করতে কাজ করবে না, এই জাতীয় ক্ষেত্রে সঠিক সমাধানের জন্য আমার উত্তরটি দেখুন।
শুভ উইল

2

যেমনটি আগে উল্লেখ করেছেন, আপনাকে অবশ্যই প্রতিটি কলামকে স্ট্রিংয়ে রূপান্তর করতে হবে এবং তারপরে দুটি স্ট্রিং কলাম একত্রিত করতে প্লাস অপারেটরটি ব্যবহার করতে হবে। আপনি NumPy ব্যবহার করে একটি বৃহত কর্মক্ষমতা উন্নতি পেতে পারেন।

%timeit df['Year'].values.astype(str) + df.quarter
71.1 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df['Year'].astype(str) + df['quarter']
565 ms ± 22.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

আমি numpyified সংস্করণ ব্যবহার করতে চান সেটি কিন্তু আমি একটি ত্রুটি পেয়ে করছি: ইনপুট : df2['filename'] = df2['job_number'].values.astype(str) + '.' + df2['task_number'].values.astype(str)-> আউটপুট : TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21')। উভয় জব_নম্বার এবং টাস্ক_ নাম্বারই ইনট are
কার্ল বেকার

এর কারণ আপনি দুটি ন্যারি অ্যারে সংযুক্ত করছেন। যদি আপনি পান্ডাস সিরিজের সাথে একটি নমপি অ্যারে সংযুক্ত করেন তবে এটি কাজ করে। যেমনdf['Year'].values.astype(str) + df.quarter
আব্দুলরেহমানলিয়াকত

2

আমি মনে করি প্যান্ডাসে কলামগুলি একত্রিত করার সর্বোত্তম উপায় হ'ল উভয় কলামকে পূর্ণসংখ্যায় রূপান্তর করা এবং তারপরে স্ট্রিতে রূপান্তর করা।

df[['Year', 'quarter']] = df[['Year', 'quarter']].astype(int).astype(str)
df['Period']= df['Year'] + 'q' + df['quarter']

উভয় কলামকে পূর্ণসংখ্যায় রূপান্তর করা হয় কেন প্রথমে ইনটে রূপান্তর করা হয়? একবার আপনি সেই বিজোড়তাটি সরিয়ে ফেললে, এই সমাধানটি বর্তমান শীর্ষ উত্তরের মতো।
এএমসি

2

কলামগুলির মানগুলির মধ্যে বিভাজকটি ব্যবহার করে নতুন কলামে আন্ত এবং str মান সহ দুটি কলাম সংযুক্ত / সংযুক্ত করতে আমার উপরের সমাধানগুলির সংক্ষিপ্তসারটি এখানে। এই উদ্দেশ্যে তিনটি সমাধান কাজ করে।

# be cautious about the separator, some symbols may cause "SyntaxError: EOL while scanning string literal".
# e.g. ";;" as separator would raise the SyntaxError

separator = "&&" 

# pd.Series.str.cat() method does not work to concatenate / combine two columns with int value and str value. This would raise "AttributeError: Can only use .cat accessor with a 'category' dtype"

df["period"] = df["Year"].map(str) + separator + df["quarter"]
df["period"] = df[['Year','quarter']].apply(lambda x : '{} && {}'.format(x[0],x[1]), axis=1)
df["period"] = df.apply(lambda x: f'{x["Year"]} && {x["quarter"]}', axis=1)

ধন্যবাদ! আপনার এফ-স্ট্রিং সলিউশনটি আমি যা আশা করছিলাম ঠিক সেটাই ছিল !!!
লিয়ারসেজ

1

ব্যবহার .combine_first

df['Period'] = df['Year'].combine_first(df['Quarter'])

এটি সঠিক নয়। .combine_firstহয় মান 'Year'সংরক্ষণ করা থেকে ফলাফল 'Period', বা, যদি এটি নাল হয়, মান থেকে 'Quarter'। এটি দুটি স্ট্রিংকে একত্রিত করতে এবং এগুলিকে সংরক্ষণ করবে না 'Period'
স্টিভ জি

এটি ফ্ল্যাট আউট ভুল।
এএমসি

0
def madd(x):
    """Performs element-wise string concatenation with multiple input arrays.

    Args:
        x: iterable of np.array.

    Returns: np.array.
    """
    for i, arr in enumerate(x):
        if type(arr.item(0)) is not str:
            x[i] = x[i].astype(str)
    return reduce(np.core.defchararray.add, x)

উদাহরণ স্বরূপ:

data = list(zip([2000]*4, ['q1', 'q2', 'q3', 'q4']))
df = pd.DataFrame(data=data, columns=['Year', 'quarter'])
df['period'] = madd([df[col].values for col in ['Year', 'quarter']])

df

    Year    quarter period
0   2000    q1  2000q1
1   2000    q2  2000q2
2   2000    q3  2000q3
3   2000    q4  2000q4

0

কেউ ডেটাফ্রেমের অ্যাসাইন পদ্ধতি ব্যবহার করতে পারে :

df= (pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']}).
  assign(period=lambda x: x.Year+x.quarter ))

-1
dataframe["period"] = dataframe["Year"].astype(str).add(dataframe["quarter"])

অথবা যদি মানগুলি [2000] [4] এর মতো হয় এবং [2000q4] করতে চান

dataframe["period"] = dataframe["Year"].astype(str).add('q').add(dataframe["quarter"]).astype(str)

স্থলে .astype(str).map(str)কাজ সঙ্গে ।


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