pandas的一些杂技(记)

HTML页面table存储成本地csv

非常简单,不需要爬虫,直接用pandas即可以搞定

"""
reference: 如果单个表格,直接存
https://www.jianshu.com/p/01c550e5341b
"""
index_url = 'https://www.postcrossing.com/explore/countries'
df = pd.read_html(index_url, encoding='utf-8', header=0)[0]
df.to_csv('./country_list.csv', index=False)
"""
reference: 如果多个表格,用for循环全部存下
https://blog.csdn.net/qq_36663202/article/details/89159878
"""
for table in pd.read_html(index_url, encoding='utf-8', header=0):
    table.to_csv('./country_list.csv', mode='a', encoding='utf-8', index=False)

表格中的NA字符串变成了nan?

本来有一个国家的缩写是NA,结果用的时候发现这个国家成了nan,一看就知道肯定是pandas读取的时候发生了什么事情。查阅资料得知,在pandas读数据的时候是有一个参数的:keep_default_na这个默认会将各种NA,N/A等等形式的字符串自动变成空值,如果不需要自动变,把这个参数设置为False即可。
ref: https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html?highlight=read_csv

检查dataframe里面有没有NaN,以及定位所在行

landmark = pd.read_csv(path)
check_for_nan = landmark.isnull().values.any()
if check_for_nan:
    print('NaN:', landmark[landmark.isna().any(axis=1)])

替换NaN值

landmark.fillna(0, inplace=True)

检查inf值以及替换

操作类似NaN的替换

landmark = pd.read_csv(path)
check_for_inf = np.isinf(landmark).values.any()
if check_for_inf:
    print('inf:', landmark[np.isinf(landmark).any(axis=1)])
    landmark[np.isinf(landmark)] = 0

df数据的读取

我想遍历一个DataFrame里面每行的某个属性值,需要的基本的操作如下:

# 获取df长度
len(df)

# 获取第0行,属性为Code的值
df.loc[0]['Code']

每行索引重置

有时候需要对dataframe做一些操作,使得行顺序变化,这会导致索引也变化。有时候就会导致一些奇怪的bug。这时候希望对操作完的dataframe重新排索引,可以简单的使用

df = df.reset_index(drop=True)

来操作。drop的含义是,丢掉原来的错误的索引列。

获取某个值所在的行号

df[df['要检索的列'].isin([目标值]])]

这样可以返回一个新的df,里面只有符合要求的一个条目。这时候可以再从里面取其他的属性
例如,对下图这样的df查询'Code'为'CN'的条目

执行以下操作

new_df = df[df['Code'].isin(['CN'])]


要取出某一个值,可以

string = new_df['Country name'].tolist()[0]
print(string)
>>> China

打乱数据顺序

df = df.sample(frac=1.0)

新数据一行一行来,怎样扩充dataframe?

先新建一个空的dataframe

headers = ['one', 'two', 'three', 'four', 'five', 'six']
df = pd.DataFrame(columns=headers)

之后每次来一个列表value = [1, 2, 3, 4, 5, 7],都可以使用

df.loc[len(df)] = value

来将value追加到df后面。

HTML页面table存储成本地csv

非常简单,不需要爬虫,直接用pandas即可以搞定

"""
reference: 如果单个表格,直接存
https://www.jianshu.com/p/01c550e5341b
"""
index_url = 'https://www.postcrossing.com/explore/countries'
df = pd.read_html(index_url, encoding='utf-8', header=0)[0]
df.to_csv('./country_list.csv', index=False)
"""
reference: 如果多个表格,用for循环全部存下
https://blog.csdn.net/qq_36663202/article/details/89159878
"""
for table in pd.read_html(index_url, encoding='utf-8', header=0):
    table.to_csv('./country_list.csv', mode='a', encoding='utf-8', index=False)

pandas把表格中的NA字符串变成了nan

本来有一个国家的缩写是NA,结果用的时候发现这个国家成了nan,一看就知道肯定是pandas读取的时候发生了什么事情。查阅资料得知,在pandas读数据的时候是有一个参数的:keep_default_na这个默认会将各种NA,N/A等等形式的字符串自动变成空值,如果不需要自动变,把这个参数设置为False即可。
ref: https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html?highlight=read_csv

df数据的读取

我想遍历一个DataFrame里面每行的某个属性值,需要的基本的操作如下:

# 获取df长度
len(df)

# 获取第0行,属性为Code的值
df.loc[0]['Code']

每行索引重置

有时候需要对dataframe做一些操作,使得行顺序变化,这会导致索引也变化。有时候就会导致一些奇怪的bug。这时候希望对操作完的dataframe重新排索引,可以简单的使用

df = df.reset_index(drop=True)

来操作。drop的含义是,丢掉原来的错误的索引列。