python - يعيش - هل دب الباندا مفترس؟
حدد صفوفًا من DataFrame استنادًا إلى القيم الموجودة في عمود في الباندا (8)
كيفية تحديد الصفوف من DataFrame على أساس القيم في بعض العمود في الباندا؟
في SQL يمكنني استخدام:
select * from table where colume_name = some_value.
حاولت أن أنظر إلى وثائق الباندا ولكن لم تجد الجواب على الفور.
ليرة تركية، والدكتور
الباندا تعادل
select * from table where column_name = some_value
هو
table[table.column_name == some_value]
شروط متعددة:
table((table.column_name == some_value) | (table.column_name2 == some_value2))
أو
table.query('column_name == some_value | column_name2 == some_value2')
مثال الكود
import pandas as pd
# Create data set
d = {'foo':[100, 111, 222],
'bar':[333, 444, 555]}
df = pd.DataFrame(d)
# Full dataframe:
df
# Shows:
# bar foo
# 0 333 100
# 1 444 111
# 2 555 222
# Output only the row(s) in df where foo is 222:
df[df.foo == 222]
# Shows:
# bar foo
# 2 555 222
في الكود أعلاه ، هو سطر df[df.foo == 222]
الذي يعطي الصفوف بناءً على قيمة العمود ، 222
في هذه الحالة.
شروط متعددة ممكنة أيضا:
df[(df.foo == 222) | (df.bar == 444)]
# bar foo
# 1 444 111
# 2 555 222
ولكن عند هذه النقطة ، أوصيك باستخدام وظيفة query ، نظرًا لأنها أقل عرضًا وتؤدي إلى نفس النتيجة:
df.query('foo == 222 | bar == 444')
أجد أن صياغة الإجابات السابقة غير متكررة ويصعب تذكرها. قدم Pandas طريقة query()
في v0.13 وأنا أفضل ذلك بكثير. لسؤالك ، يمكنك القيام به df.query('col == val')
مستنسخة من http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query
In [167]: n = 10
In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))
In [169]: df
Out[169]:
a b c
0 0.687704 0.582314 0.281645
1 0.250846 0.610021 0.420121
2 0.624328 0.401816 0.932146
3 0.011763 0.022921 0.244186
4 0.590198 0.325680 0.890392
5 0.598892 0.296424 0.007312
6 0.634625 0.803069 0.123872
7 0.924168 0.325076 0.303746
8 0.116822 0.364564 0.454607
9 0.986142 0.751953 0.561512
# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]:
a b c
3 0.011763 0.022921 0.244186
8 0.116822 0.364564 0.454607
# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]:
a b c
3 0.011763 0.022921 0.244186
8 0.116822 0.364564 0.454607
يمكنك أيضًا الوصول إلى المتغيرات في البيئة عن طريق إضافة @
إلى prepending.
exclude = ('red', 'orange')
df.query('color not in @exclude')
اليك مثال بسيط
from pandas import DataFrame
# Create data set
d = {'Revenue':[100,111,222],
'Cost':[333,444,555]}
df = DataFrame(d)
# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111
print mask
# Result:
# 0 False
# 1 True
# 2 False
# Name: Revenue, dtype: bool
# Select * FROM df WHERE Revenue = 111
df[mask]
# Result:
# Cost Revenue
# 1 444 111
لإلحاق هذا السؤال المشهور (على الرغم من أنه متأخر جدًا): يمكنك أيضًا القيام بـ df.groupby('column_name').get_group('column_desired_value').reset_index()
لإنشاء إطار جديد للبيانات مع عمود محدد له قيمة معينة . على سبيل المثال
import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)
b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1)
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)
تشغيل هذا يعطي:
Original dataframe:
A B
0 foo one
1 bar one
2 foo two
3 bar three
4 foo two
5 bar two
6 foo one
7 foo three
Sub dataframe where B is two:
A B
0 foo two
1 foo two
2 bar two
لتحديد الصفوف التي تساوي قيمة العمود الخاصة بها قيمة قياسية ، some_value
، استخدم ==
:
df.loc[df['column_name'] == some_value]
لتحديد الصفوف التي تكون قيمة العمود الخاصة بها في قيمة iterable ، some_values
، استخدم isin
:
df.loc[df['column_name'].isin(some_values)]
دمج شروط متعددة مع &
:
df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]
لتحديد الصفوف التي لا تساوي قيمة العمود الخاصة بها some_value
، استخدم !=
:
df.loc[df['column_name'] != some_value]
isin
بإرجاع سلسلة منطقية ، بحيث يتم تحديد الصفوف التي ليست قيمتها في some_values
، قم some_values
سلسلة boolean باستخدام ~
:
df.loc[~df['column_name'].isin(some_values)]
فمثلا،
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
عائدات
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
إذا كان لديك قيم متعددة ترغب في تضمينها ، isin
في قائمة (أو بشكل عام ، أيًا كانت isin
للتكرار) واستخدم isin
:
print(df.loc[df['B'].isin(['one','three'])])
عائدات
A B C D
0 foo one 0 0
1 bar one 1 2
3 bar three 3 6
6 foo one 6 12
7 foo three 7 14
ومع ذلك ، لاحظ أنه إذا كنت ترغب في القيام بذلك عدة مرات ، فمن الأفضل جعل الفهرس أولاً ، ثم استخدم df.loc
:
df = df.set_index(['B'])
print(df.loc['one'])
عائدات
A C D
B
one foo 0 0
one bar 1 2
one foo 6 12
أو ، لتضمين قيم متعددة من الفهرس ، استخدم df.index.isin
:
df.loc[df.index.isin(['one','two'])]
عائدات
A C D
B
one foo 0 0
one bar 1 2
two foo 2 4
two foo 4 8
two bar 5 10
one foo 6 12
لقد حاولت للتو تعديل هذا ، ولكن لم أسجل الدخول ، لذا فأنا لست متأكدًا من أين ذهب تعديلي. كنت أحاول دمج اختيار متعددة. لذا أعتقد أن الإجابة الأفضل هي:
من أجل قيمة واحدة ، من المحتمل أن يكون الأكثر مباشرة (من الممكن قراءتها على البشر):
df.loc[df['column_name'] == some_value]
بالنسبة إلى قوائم القيم ، يمكنك أيضًا استخدام:
df.loc[df['column_name'].isin(some_values)]
فمثلا،
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
عائدات
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
إذا كان لديك معايير متعددة تريد تحديدها ، فيمكنك وضعها في قائمة واستخدام "isin ':
print(df.loc[df['B'].isin(['one','three'])])
عائدات
A B C D
0 foo one 0 0
1 bar one 1 2
3 bar three 3 6
6 foo one 6 12
7 foo three 7 14
ومع ذلك ، لاحظ أنه إذا كنت ترغب في القيام بذلك عدة مرات ، فمن الأفضل جعل A الفهرس أولاً ، ثم استخدم df.loc:
df = df.set_index(['A'])
print(df.loc['foo'])
عائدات
A B C D
foo one 0 0
foo two 2 4
foo two 4 8
foo one 6 12
foo three 7 14
يمكن تحقيق نتائج أسرع باستخدام numpy.where .
على سبيل المثال ، مع إعداد unubtu -
In [76]: df.iloc[np.where(df.A.values=='foo')]
Out[76]:
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
مقارنات التوقيت:
In [68]: %timeit df.iloc[np.where(df.A.values=='foo')] # fastest
1000 loops, best of 3: 380 µs per loop
In [69]: %timeit df.loc[df['A'] == 'foo']
1000 loops, best of 3: 745 µs per loop
In [71]: %timeit df.loc[df['A'].isin(['foo'])]
1000 loops, best of 3: 562 µs per loop
In [72]: %timeit df[df.A=='foo']
1000 loops, best of 3: 796 µs per loop
In [74]: %timeit df.query('(A=="foo")') # slowest
1000 loops, best of 3: 1.71 ms per loop
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
df[df['A']=='foo']
OUTPUT:
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14