অক্ষ একের উপরে স্থানান্তরিত করার সময় ডাইটিপস ম্যাক জিনিসগুলি (কলাম)


9

ডেটাফ্রেম বিবেচনা করুন df

df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))

df

   A  B
0  1  X
1  2  Y

যদি আমি বরাবর স্থানান্তরিত axis=0(ডিফল্ট)

df.shift()

     A    B
0  NaN  NaN
1  1.0    X

এটি প্রত্যাশা অনুযায়ী সমস্ত সারি এক সারি নিচে দিকে ঠেলে দেয়।

তবে আমি যখন শিফট করব axis=1

df.shift(axis=1)

    A    B
0 NaN  NaN
1 NaN  NaN

যখন আমি প্রত্যাশা করি তখন সমস্ত কিছুই শূন্য হয়

     A  B
0  NaN  1
1  NaN  2

আমি বুঝতে পারছি কেন এমনটি হয়েছিল। কারণ axis=0পান্ডাস কলাম দ্বারা কলাম পরিচালনা করছে যেখানে প্রতিটি কলামই একক dtypeএবং স্থানান্তরিত হওয়ার সময়, প্রারম্ভিক NaNমানটির শুরুতে বা শেষে কীভাবে মোকাবেলা করা যায় সে সম্পর্কে স্পষ্ট প্রোটোকল রয়েছে । তবে যখন সরানোর সময় axis=1আমরা dtypeএকটি কলাম থেকে অন্য কলামের সম্ভাব্য অস্পষ্টতা পরিচয় করিয়ে দেই । এই ক্ষেত্রে, আমি int64একটি objectকলামে বল প্রয়োগ করার চেষ্টা করছি এবং পান্ডাস কেবল মানগুলি বাতিল করার সিদ্ধান্ত নিয়েছে।

যখন এই সমস্যাসঙ্কুল হয়ে dtypesআছে int64এবংfloat64

df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))

df

   A    B
0  1  1.0
1  2  2.0

এবং একই জিনিস ঘটে

df.shift(axis=1)

    A   B
0 NaN NaN
1 NaN NaN

আমার প্রশ্ন

ভাল কি একটি ডেটাফ্রেম তৈরির জন্য বিকল্প axis=1যা বরাবর স্থানান্তরিত হয় যাতে ফলাফলটি মান এবং টাইপগুলি স্থানান্তরিত করে?

জন্য int64/ float64ক্ষেত্রে ফলাফলের অনুরূপ হবে:

df_shifted

     A  B
0  NaN  1
1  NaN  2

এবং

df_shifted.dtypes

A    object
B     int64
dtype: object

আরও ব্যাপক উদাহরণ

df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.], C=['X', 'Y'], D=[4., 5.], E=[4, 5]))

df

   A    B  C    D  E
0  1  1.0  X  4.0  4
1  2  2.0  Y  5.0  5

এই মত চেহারা উচিত

df_shifted

     A  B    C  D    E
0  NaN  1  1.0  X  4.0
1  NaN  2  2.0  Y  5.0

df_shifted.dtypes

A     object
B      int64
C    float64
D     object
E    float64
dtype: object

আমার কাছে বাগের মতো মনে হচ্ছে, আপনি যদি সমস্ত কলামের ডাইপগুলি তৈরি করেন তবে কি হবে object?
এডচুম

এটা কাজ করে। আমি ইতিমধ্যে বেশ কয়েক দফায় কাজ পেয়েছি। আমি সম্প্রদায়কে কিছু ধারণা দেওয়ার জন্য ডেকে আছি।
পাইরাস্কোয়ার্ড

আমি এটিকে একটি সমস্যা হিসাবে ফাইল করব, তাদের কমপক্ষে একটি মিশ্র টাইপ যেমন ddpe প্রচারের জন্য একটি বিকল্প প্রস্তাব দেওয়া উচিতobject
এডচাম

আমি এখন এটি করব।
পাইরাস্কোয়ার্ড

1
@ এডচাম-রিইনস্টেটমোনিকা এক মিনিট অপেক্ষা করুন! শিফটটি ঘটবে>> blocks<পরিবর্তে এটি ব্যবহার করুন এবং দেখুনdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
পিয়ারস্কোয়ার্ড

উত্তর:


7

দেখা যাচ্ছে যে পান্ডাস একই ধরণের ব্লকের উপর সরে যাচ্ছেন dtypes

dfহিসাবে সংজ্ঞায়িত করুন

df = pd.DataFrame(dict(
    A=[1, 2], B=[3., 4.], C=['X', 'Y'],
    D=[5., 6.], E=[7, 8], F=['W', 'Z']
))

df

#  i    f  o    f  i  o
#  n    l  b    l  n  b
#  t    t  j    t  t  j
#
   A    B  C    D  E  F
0  1  3.0  X  5.0  7  W
1  2  4.0  Y  6.0  8  Z

এটি পূর্ণসংখ্যাটি পরবর্তী সংখ্যার কলামে স্থানান্তর করবে, ফ্লোটগুলি পরবর্তী ফ্লোট কলামে এবং বস্তুগুলি পরবর্তী বস্তুর কলামে স্থানান্তর করবে

df.shift(axis=1)

    A   B    C    D    E  F
0 NaN NaN  NaN  3.0  1.0  X
1 NaN NaN  NaN  4.0  2.0  Y

আমি যে একটি ভাল ধারণা জানি না, কিন্তু যে হয় কি ঘটছে।


পন্থা

astype(object) প্রথম

dtypes = df.dtypes.shift(fill_value=object)
df_shifted = df.astype(object).shift(1, axis=1).astype(dtypes)

df_shifted

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

transpose

এটি তৈরি করবে object

dtypes = df.dtypes.shift(fill_value=object)
df_shifted = df.T.shift().T.astype(dtypes)

df_shifted

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

itertuples

pd.DataFrame([(np.nan, *t[1:-1]) for t in df.itertuples()], columns=[*df])

     A  B    C  D    E  F
0  NaN  1  3.0  X  5.0  7
1  NaN  2  4.0  Y  6.0  8

যদিও আমি সম্ভবত এটি করতাম

pd.DataFrame([
    (np.nan, *t[:-1]) for t in
    df.itertuples(index=False, name=None)
], columns=[*df])

4
এটি অবশ্যই আমার কাছে একটি বাগ, এটি কীড কলামগুলি থাকা এবং এন পদগুলি কলাম অনুসারে স্থানান্তরিতকরণের পুরো পয়েন্টটিকে অকার্যকর করে দেয়
এডচাম

1
আমি আমার সভার পরে একটি ইস্যু পোস্ট করব।
পাইরাস্কোয়ার্ড

যদি এটি সমস্ত strডাইপস হয় তবে এটি সঠিকভাবে কাজ করে, আপনি যদি এই ডিএফ একইরকম করেন df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))তবে এটি 'XY'কলামটি কলামে সমস্তভাবে সরিয়ে দেয় 'F', এটি অবশ্যই আমার পক্ষে ভুল, আমার পান্ডাস সংস্করণটি 0.24.2, এটি dtypeপ্রচার করে না এবং কলামগুলিকে এ জাতীয় স্থান পরিবর্তন করে না একটি উপায়
এডচুম


1

আমি একটি numpyপদ্ধতি ব্যবহার করার চেষ্টা করেছি । পদ্ধতিটি যতক্ষণ কাজ করবে আপনি যতক্ষণ না আপনার ডেটাটিকে অসাড় অ্যারে রাখবেন:

def shift_df(data, n):
    shifted = np.roll(data, n)
    shifted[:, :n] = np.NaN

    return shifted

shifted(df, 1)

array([[nan, 1, 1.0, 'X', 4.0],
       [nan, 2, 2.0, 'Y', 5.0]], dtype=object)

কিন্তু আপনি যখন DataFrameনির্মাতাকে কল করেন তখন সমস্ত কলামগুলিতে রূপান্তরিত হয় objectযদিও অ্যারের মানগুলি float, int, object:

def shift_df(data, n):
    shifted = np.roll(data, n)
    shifted[:, :n] = np.NaN
    shifted = pd.DataFrame(shifted)

    return shifted

print(shift_df(df, 1),'\n')
print(shift_df(df, 1).dtypes)

     0  1  2  3  4
0  NaN  1  1  X  4
1  NaN  2  2  Y  5 

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