اذهب إلى المحتوى

السؤال

نشر (معدل)

قمت بعمل dataframe كالتالي:

df = DataFrame(index=['A','B','C'], columns=['D','E'])

>>> df
    D    E
A  NaN  NaN
B  NaN  NaN
C  NaN  NaN

وأريد وضع قيمة في خانة معينة بناء على مكان الخانة index بحيث تظهر كالتالي:

    D    E
A  NaN  NaN
B  NaN  NaN
C  20   NaN

كيف يمكنني فعل هذا؟

تم التعديل في بواسطة Mohamed Elnemr

Recommended Posts

  • 1
نشر

يمكنك استخدام .iat / .at , لنفترض أن لديك إطار data_frame التالي

   A   B   C
0  1   8   4 
1  3   9   6
2  22 33  52

إذا أردنا تعديل قيمة الخلية [0 ، "A"] يمكنك استخدام أحد هذه الحلول:

df.iat[0,0] = 2
df.at[0,'A'] = 2

وإليك مثال كامل عن كيفية استخدام iat للحصول على قيمة الخلية وتعيينها:

def prepossessing(df):
  for index in range(0,len(df)): 
      df.iat[index,0] = df.iat[index,0] * 2
  return df

أو يمكنك استخدام الحل الآتي

df.loc[index_position, "column_name"] = some_value

 

  • 1
نشر

اذا كنت تريد التعديل على ال dataframe بحيث تقوم بعمل نسخة معدلة مع ابقاء النسخة الأصلية غير معدلة يمكنك عمل التالي:

df.xs('C')['D']=20

اما اذا أردت التعديل على ال dataframe الأصلية فيمكنك استخدام الكود التالي:

df.at['C', 'D'] = 20

وكذلك يمكنك استخدام set_value كالتالي:

df.set_value('C', 'D', 20)

 

  • 1
نشر

إليك جميع الطرق مع مقارنة بزمن التنفيذ بينها:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(100, 100))
%timeit df.iat[50,50]=50 # ✓
%timeit df.at[50,50]=50 #  ✔
%timeit df.set_value(50,50,50) # سوف يتم إلغاءها في قادم النسخ
%timeit df.iloc[50,50]=50
%timeit df.loc[50,50]=50
"""
7.06 µs ± 118 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  الأفضل
5.52 µs ± 64.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) الأفضل
3.68 µs ± 80.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
98.7 µs ± 1.07 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
109 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
"""

كما يمكنك تعديل القيم بالشكل التالي:

import pandas as pd
df = pd.DataFrame(index=['A','B','C'], columns=['D','E'])
df.D["C"]=2

 

  • 0
نشر

يجب أن تنتبه أن df.iloc, df.loc, df.at يتم تنفيذهم مع حالة كان index بإستخدام الكلمات كما في المثال او الأرقام، df.iloc تعمل فقط في حال كان integer index. أما df.loc و df.at يمكن أن يعملان في حالة كنت تريد الإضافة بإستخدام إسم العمود مع integer index.

في حالة كان index غير معرف فإن كل من df.loc , df.at يقومان بالإضافة في dataframe بصورة مباشرة و لكن df.iloc تقوم بإنشاء خطأ، لاحظ المثال التالي:

import numpy as np, pandas as pd

df = pd.DataFrame(index=np.arange(3), columns=['x','y','z'])
df['x'] = ['A','B','C']
df.at[2,'y'] = 400

# الأسطر و الأعمدة غير موجودة في البيانات الأساسية بالتالي يتم  إضافتهم
df.at['D','w'] = 9000
df.loc['E','q'] = 499

# هذه الطريقة تقوم بإستخدام عبارة شرطية لفلترة البيانات و من قم الإضافة
df.at[df1['x']=='B', 'y'] = 10000
df.loc[df1['x']=='B', ['z','w']] = 10000

# إضافة قيم بإستخدام index
df.iloc[[1,2,4], 2] = 9999
df.loc[[0,'D','E'],'w'] = 7500
df.at[[0,2,"D"],'x'] = 10
df.at[:, ['y', 'w']] = 8000

df

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...