python - يعيش - هل دب الباندا مفترس؟




حدد صفوفًا من DataFrame استنادًا إلى القيم الموجودة في عمود في الباندا (8)

ليرة تركية، والدكتور

الباندا تعادل

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')

كيفية تحديد الصفوف من DataFrame على أساس القيم في بعض العمود في الباندا؟
في SQL يمكنني استخدام:

select * from table where colume_name = some_value. 

حاولت أن أنظر إلى وثائق الباندا ولكن لم تجد الجواب على الفور.


أجد أن صياغة الإجابات السابقة غير متكررة ويصعب تذكرها. قدم 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




dataframe