GVKun编程网logo

Python-从pandas.DataFrame使用复杂条件选择(pandas dataframe选择列)

33

在本文中,我们将详细介绍Python-从pandas.DataFrame使用复杂条件选择的各个方面,并为您提供关于pandasdataframe选择列的相关解答,同时,我们也将为您带来关于Pandas

在本文中,我们将详细介绍Python-从pandas.DataFrame使用复杂条件选择的各个方面,并为您提供关于pandas dataframe选择列的相关解答,同时,我们也将为您带来关于Pandas DataFrame使用另一个DataFrame列过滤行、Python Pandas -- DataFrame、Python pandas dataframe、Python pandas Dataframe 列到行操作的有用知识。

本文目录一览:

Python-从pandas.DataFrame使用复杂条件选择(pandas dataframe选择列)

Python-从pandas.DataFrame使用复杂条件选择(pandas dataframe选择列)

例如,我有简单的DF:

import pandas as pdfrom random import randintdf = pd.DataFrame({''A'': [randint(1, 9) for x in xrange(10)],                   ''B'': [randint(1, 9)*10 for x in xrange(10)],                   ''C'': [randint(1, 9)*100 for x in xrange(10)]})

我可以使用熊猫的方法和惯用法从“ A”中选择与B对应的值大于50的值,对于C对应的值大于900的值吗?

答案1

小编典典

当然!设定:

>>> import pandas as pd>>> from random import randint>>> df = pd.DataFrame({''A'': [randint(1, 9) for x in range(10)],                   ''B'': [randint(1, 9)*10 for x in range(10)],                   ''C'': [randint(1, 9)*100 for x in range(10)]})>>> df   A   B    C0  9  40  3001  9  70  7002  5  70  9003  8  80  9004  7  50  2005  9  30  9006  2  80  7007  2  80  4008  5  80  3009  7  70  800

我们可以应用列操作并获取布尔系列对象:

>>> df["B"] > 500    False1     True2     True3     True4    False5    False6     True7     True8     True9     TrueName: B>>> (df["B"] > 50) & (df["C"] == 900)0    False1    False2     True3     True4    False5    False6    False7    False8    False9    False

[更新,切换到新样式.loc]:

然后,我们可以使用它们来索引对象。对于读取访问,可以链接索引:

>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]2    53    8Name: A, dtype: int64

但是由于视图和执行写操作的副本之间的差异,您可能会遇到麻烦。您可以.loc改用:

>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]2    53    8Name: A, dtype: int64>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].valuesarray([5, 8], dtype=int64)>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000>>> df      A   B    C0     9  40  3001     9  70  7002  5000  70  9003  8000  80  9004     7  50  2005     9  30  9006     2  80  7007     2  80  4008     5  80  3009     7  70  800

请注意,我不小心输入了== 900not != 900和或~(df[“C”] == 900),但我懒得修复它。为读者练习。:^)

Pandas DataFrame使用另一个DataFrame列过滤行

Pandas DataFrame使用另一个DataFrame列过滤行

我会做merge

out = df1.merge(df2[['col1','col2']],on = 'col1',suffixes = ('','1')).query('col3>=col21').drop('col21',1)

out
Out[15]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

reindex

out = df1[df1['col3'] >= df2.set_index('col1')['col2'].reindex(df1['col1']).values]
Out[19]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

您还可以使用map

 df1.loc[df1.col3 >= df1.col1.map(df2.set_index("col1").col2)]
,

我的方法类似于@Ben_Yo的合并答案,但是代码更多,但也许更直接。

您只需:

  1. 合并该列并创建新的数据框 ZStack{ Rectangle() .frame(width: geometry.size.width,height: geometry.size.height/3.25) .shadow(radius: 5) .foregroundColor(Color.white) //Words ontop of the Rectangle VStack { HStack { Spacer() Text("Hello World") }.padding(.trailing,40) Spacer() //<-- PROBLEM HERE }//.offset(y: -40) }
  2. 根据条件(在本例中为s
  3. ),将数据名人s更改为返回TrueFalse的布尔系列。
  4. 最后,将s['col3'] >= s['col2']传递给s,结果将排除布尔系列df1中返回False的行:

s

Python Pandas -- DataFrame

Python Pandas -- DataFrame

pandas.DataFrame

class  pandas. DataFrame (data=Noneindex=Nonecolumns=Nonedtype=Nonecopy=False)[source]

Two-dimensional size-mutable, potentially heterogeneous tabular data structure with labeled axes (rows and columns). Arithmetic operations align on both row and column labels. Can be thought of as a dict-like container for Series objects. The primary pandas data structure

Parameters:

data : numpy ndarray (structured or homogeneous), dict, or DataFrame

Dict can contain Series, arrays, constants, or list-like objects

index : Index or array-like

Index to use for resulting frame. Will default to np.arange(n) if no indexing information part of input data and no index provided

columns : Index or array-like

Column labels to use for resulting frame. Will default to np.arange(n) if no column labels are provided

dtype : dtype, default None

Data type to force. Only a single dtype is allowed. If None, infer

copy : boolean, default False

Copy data from inputs. Only affects DataFrame / 2d ndarray input

See also

DataFrame.from_records
constructor from tuples, also record arrays
DataFrame.from_dict
from dicts of Series, arrays, or dicts
DataFrame.from_items
from sequence of (key, value) pairs

pandas.read_csvpandas.read_tablepandas.read_clipboard

1. 先来个小菜

  基于dictionary创建

from pandas import Series, DataFrame
import pandas as pd  
import numpy as np
d = {''col1'':[1,2],''col2'':[3,4]}
df = pd.DataFrame(data=d)
print(df)
print(df.dtypes)
#   col1  col2
#0     1     3
#1     2     4
#col1    int64
#col2    int64
#dtype: object

基于Numy的ndarrary

df2 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),columns=[''a'', ''b'', ''c'', ''d'', ''e''])
print (df2)
#   a  b  c  d  e
#0  0  2  4  7  0
#1  6  7  3  4  1
#2  5  3  3  8  7
#3  0  9  4  3  4
#4  7  4  7  0  0

 

Python pandas dataframe

Python pandas dataframe

 dataframe 列类型

df['客户id'] = df['客户id'].apply(pd.to_numeric)
df = pd.DataFrame(a, dtype='float')  #示例1
df = pd.DataFrame(data=d, dtype=np.int8) #示例2
df = pd.read_csv("somefile.csv", dtype = {'column_name' : str})
df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)
df[['two', 'three']] = df[['two', 'three']].astype(float)

    df.dtypes

    type(mydata[0][0])

   维度查看:df.shape
   数据表基本信息(维度、列名称、数据格式、所占空间等):df.info()
   每一列数据的格式:df.dtypes
   某一列格式:df['B'].dtype

文件操作

DataFrame 数据的保存和读取

  • df.to_csv 写入到 csv 文件
  • pd.read_csv 读取 csv 文件
  • df.to_json 写入到 json 文件
  • pd.read_json 读取 json 文件
  • df.to_html 写入到 html 文件
  • pd.read_html 读取 html 文件
  • df.to_excel 写入到 excel 文件
  • pd.read_excel 读取 excel 文件

pandas.DataFrame.to_csv
将 DataFrame 写入到 csv 文件
    DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True,
                     index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"',
                     line_terminator='\n', chunksize=None, tupleize_cols=None, date_format=None, doublequote=True,
                     escapechar=None, decimal='.')

参数:
    path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json
    sep : 输出文件的字段分隔符,默认为 “,”
    na_rep : 用于替换空数据的字符串,默认为''
    float_format : 设置浮点数的格式(几位小数点)
    columns : 要写的列
    header : 是否保存列名,默认为 True ,保存
    index : 是否保存索引,默认为 True ,保存
    index_label : 索引的列标签名

 

 

 

条件筛选

单条件筛选

选取col1列的取值大于n的记录: data[data['col1']>n]
筛选col1列的取值大于n的记录,但是显示col2,col3列的值: data[['col2','col3']][data['col1']>n]
选择特定行:使用isin函数根据特定值筛选记录。筛选col1值等于list中元素的记录: data[data.col1.isin(list)]
 
 

多条件筛选

可以使用&(并)与| (或)操作符或者特定的函数实现多条件筛选
使用&筛选col1列的取值大于n,col2列的取值大于m的记录:data[(data['col1'] > n) & (data['col2'] > m)]
使用numpy的logical_and函数完成同样的功能:data[np.logical_and(data['col1']> n,data['col2']>m)]
 
 

索引筛选

切片操作

使用切片操作选择特定的行: data[n:m]
传入列名选择特定的列: data[['col1','col2']]
 

loc函数[行用序号,列用名称]

当每列已有column name时,用 data ['col1'] 就能选取出一整列数据。如果你知道column names 和index,可以选择 .loc同时进行行列选择: data.loc[index,'colum_names']
 

iloc函数[行用序号,列用序号]

使用方法同loc函数,但是不再输入列名,而是输入列的index: data.iloc[row_index,col_index]

 

ix函数

ix的功能更加强大,参数既可以是索引,也可以是名称,相当于,loc和iloc的合体。需要注意的是在使用的时候需要统一,在行选择时同时出现索引和名称, 同样在同行选择时同时出现索引和名称: data.ix[n:m,['col1','col2']]
但是在最新的版本中,ix函数不建议使用
 
 

at函数

根据指定行index及列label,快速定位DataFrame的元素,选择列时仅支持列名:data.at[row_index,'column_names']
 
 

iat函数

与at的功能相同,只使用索引参数:data.iat[row_index,column_index]

 

 

df.set_index('month')    

df.set_index(['year','month'])     

DataFrame.columns = [newName]

df['Hour'] = pd.to_datetime(df['report_date'])

df.rename(index = str,column = new_names)

 

删除列

#通过特征选取
data = data[['age']]

#通过del 关键字
del  data['name']

#通过drop函数
data.drop(['name'],axis=1, inplace=True)

#通过pop
data.pop('name')

 

df = pd.read_csv(INPUTFILE, encoding = "utf-8")

df_bio = pd.read_csv(INPUTFILE, encoding = "utf-8", header=None) # header=None, header=0

 

显示前几行

df.head()

显示后几行

df.tail()

 

删除重复的数据
isDuplicated=df.duplicated() #判断重复数据记录
print(isDuplicated)
0    False
1    False
2     True
3    False
dtype: bool

#删除重复的数据
print(df.drop_duplicates()) #删除所有列值相同的记录,index为2的记录行被删除
  col1  col2
0    a     3
1    b     2
3    c     2

print(df.drop_duplicates(['col1'])) #删除col1列值相同的记录,index为2的记录行被删除
  col1  col2
0    a     3
1    b     2
3    c     2

print(df.drop_duplicates(['col2'])) #删除col2列值相同的记录,index为2和3的记录行被删除
  col1  col2
0    a     3
1    b     2

print(df.drop_duplicates(['col1','col2'])) #删除指定列(col1和col2)值相同的记录,index为2的记录行被删除
  col1  col2
0    a     3
1    b     2
3    c     2

df 某一列字母转大写小写
df['列名'] = df['列名'].str.upper()

df['列名'] = df['列名'].str.lower()

 

 

REF

https://www.cnblogs.com/aro7/p/9748202.html

https://www.cnblogs.com/hankleo/p/11462532.html

Python pandas Dataframe 列到行操作

Python pandas Dataframe 列到行操作

如何解决Python pandas Dataframe 列到行操作?

我正在尝试转置几列,同时保留其他列。我在使用枢轴代码或转置代码时遇到了困难,因为它并没有真正给我我需要的输出。

有人可以帮忙吗?

我有这个数据框:

EmpID 目标 第 1 周 第 2 周 第 3 周 第 4 周
1 556 54 33 24 54
2 342 32 32 56 43
3 534 43 65 64 21
4 244 45 87 5 22

我预期的数据帧输出是:

EmpID 目标 实际
1 556 第 1 周 54
1 556 第 2 周 33
1 556 第 3 周 24
1 556 第 4 周 54

依此类推,直到列出完整的员工 ID..

解决方法

类似的东西。

# Python - melt DF
import pandas as pd

d = {''Country Code'': [1960,1961,1962,1963,1964,1965,1966],''ABW'':  [2.615300,2.734390,2.678430,2.929920,2.963250,3.060540,4.349760],''AFG'':  [0.249760,0.218480,0.210840,0.217240,0.211410,0.209910,0.671330],''ALB'':  [''NaN'',''NaN'',1.12214]}
df = pd.DataFrame(data=d)

print(df)
df1 = (df.melt([''Country Code''],var_name=''Year'',value_name=''Econometric_Metric'')
        .sort_values([''Country Code'',''Year''])
        .reset_index(drop=True))
print(df1)

df2 = (df.set_index([''Country Code''])
        .stack(dropna=False)
        .reset_index(name=''Econometric_Metric'')
        .rename(columns={''level_1'':''Year''}))
print(df2)


# BEFORE
       ABW      AFG      ALB  Country Code
0  2.61530  0.24976      NaN          1960
1  2.73439  0.21848      NaN          1961
2  2.67843  0.21084      NaN          1962
3  2.92992  0.21724      NaN          1963
4  2.96325  0.21141      NaN          1964
5  3.06054  0.20991      NaN          1965
6  4.34976  0.67133  1.12214          1966


# AFTER
    Country Code Year Econometric_Metric
0           1960  ABW             2.6153
1           1960  AFG            0.24976
2           1960  ALB                NaN
3           1961  ABW            2.73439
4           1961  AFG            0.21848
5           1961  ALB                NaN
6           1962  ABW            2.67843
7           1962  AFG            0.21084
8           1962  ALB                NaN
9           1963  ABW            2.92992
10          1963  AFG            0.21724
11          1963  ALB                NaN
12          1964  ABW            2.96325
13          1964  AFG            0.21141
14          1964  ALB                NaN
15          1965  ABW            3.06054
16          1965  AFG            0.20991
17          1965  ALB                NaN
18          1966  ABW            4.34976
19          1966  AFG            0.67133
20          1966  ALB            1.12214
    Country Code Year Econometric_Metric
0           1960  ABW             2.6153
1           1960  AFG            0.24976
2           1960  ALB                NaN
3           1961  ABW            2.73439
4           1961  AFG            0.21848
5           1961  ALB                NaN
6           1962  ABW            2.67843
7           1962  AFG            0.21084
8           1962  ALB                NaN
9           1963  ABW            2.92992
10          1963  AFG            0.21724
11          1963  ALB                NaN
12          1964  ABW            2.96325
13          1964  AFG            0.21141
14          1964  ALB                NaN
15          1965  ABW            3.06054
16          1965  AFG            0.20991
17          1965  ALB                NaN
18          1966  ABW            4.34976
19          1966  AFG            0.67133
20          1966  ALB            1.12214

另外,查看下面的链接,了解更多信息。

https://www.dataindependent.com/pandas/pandas-melt/

关于Python-从pandas.DataFrame使用复杂条件选择pandas dataframe选择列的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Pandas DataFrame使用另一个DataFrame列过滤行、Python Pandas -- DataFrame、Python pandas dataframe、Python pandas Dataframe 列到行操作的相关信息,请在本站寻找。

本文标签: