Series[] 和 .loc[] 有时 returns 一个单一的值,有时出乎意料的是一个包含相同值的单一元素 Series
Series [] and .loc[] sometimes returns a single value, and sometimes unexpectedly a single element Series containing the same value
在下面的代码中,我试图在 DataFrame 列中找到最长的字符串。
根据列的长度,(maxstr)下面的函数,returns是短列的单值(符合预期),长列是单元素系列(没想到这个)。
任何指点将不胜感激。
我使用了 Find length of longest string in Pandas dataframe column
中讨论的方法
import numpy as np
import pandas as pd
由于数据量很大,我会边走边显示数据框和系列上的信息。
从剪贴板读取数据帧
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
print(f'{type(df)=}')
print(f'{df.shape=}')
print(f'{df.dtypes=}')
print(f'{df.columns=}')
type(df)=<class 'pandas.core.frame.DataFrame'>
df.shape=(581, 6)
df.dtypes=CID int64
TITLE object
FIRSTNAME object
FUNCTION object
PHONE object
EMAIL object
dtype: object
df.columns=Index(['CID', 'TITLE', 'FIRSTNAME', 'FUNCTION', 'PHONE', 'EMAIL'], dtype='object')
函数return最大长度字符串等价于column/series
def maxstr(ser: pd.Series):
print(f'{type(ser)=}')
print(f'\n{type(ser.astype(str).str.len().idxmax())=}')
print(f'{type(ser[ser.astype(str).str.len().idxmax()])=}')
# should return a single value and not a series
return ser[ser.astype(str).str.len().idxmax()]
使用短列 (n=50),我得到一个 int(如预期的那样)
short = df.head(50)
short_return = maxstr(short['CID'])
type(ser)=<class 'pandas.core.series.Series'>
type(ser.astype(str).str.len().idxmax())=<class 'tuple'>
type(ser[ser.astype(str).str.len().idxmax()])=<class 'numpy.int64'>
使用来自相同数据帧(相同数据)(n=100) 的长列,我得到了一个系列(不是预期的??)
long = df.head(100)
long_return = maxstr(long['CID'])
type(ser)=<class 'pandas.core.series.Series'>
type(ser.astype(str).str.len().idxmax())=<class 'tuple'>
type(ser[ser.astype(str).str.len().idxmax()])=<class 'pandas.core.series.Series'>
在这两种情况下,我们都找到相同的 int 值(但一个在一系列中,另一个作为单个值)
short_return == long_return.iloc[0]
True
int 值是唯一的,因此它在 dataframe 列中出现一次
value = short_return
print(f'The value: {value=}')
print(f'{sum(short["CID"] == value)=}')
print(f'{sum(long["CID"] == value)=}')
The value: value=1937
sum(short["CID"] == value)=1
sum(long["CID"] == value)=1
在我看来问题是重复的索引值,所以如果 idxmax
return tuple
是重复的,returned 不是标量,而是所有重复的行在选择中。
避免它的简单解决方案是创建默认索引,这里更改:
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
至:
df = pd.read_clipboard(sep='\t', na_values='')
表示没有 MultiIndex
,但默认为 RangeIndex
。
检查是否 RangeIndex
:
print (df.index)
如果需要解决方案MultiIndex
是删除重复值:
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
df = df[~df.index.duplicated()]
在下面的代码中,我试图在 DataFrame 列中找到最长的字符串。
根据列的长度,(maxstr)下面的函数,returns是短列的单值(符合预期),长列是单元素系列(没想到这个)。
任何指点将不胜感激。
我使用了 Find length of longest string in Pandas dataframe column
中讨论的方法import numpy as np
import pandas as pd
由于数据量很大,我会边走边显示数据框和系列上的信息。
从剪贴板读取数据帧
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
print(f'{type(df)=}')
print(f'{df.shape=}')
print(f'{df.dtypes=}')
print(f'{df.columns=}')
type(df)=<class 'pandas.core.frame.DataFrame'>
df.shape=(581, 6)
df.dtypes=CID int64
TITLE object
FIRSTNAME object
FUNCTION object
PHONE object
EMAIL object
dtype: object
df.columns=Index(['CID', 'TITLE', 'FIRSTNAME', 'FUNCTION', 'PHONE', 'EMAIL'], dtype='object')
函数return最大长度字符串等价于column/series
def maxstr(ser: pd.Series):
print(f'{type(ser)=}')
print(f'\n{type(ser.astype(str).str.len().idxmax())=}')
print(f'{type(ser[ser.astype(str).str.len().idxmax()])=}')
# should return a single value and not a series
return ser[ser.astype(str).str.len().idxmax()]
使用短列 (n=50),我得到一个 int(如预期的那样)
short = df.head(50)
short_return = maxstr(short['CID'])
type(ser)=<class 'pandas.core.series.Series'>
type(ser.astype(str).str.len().idxmax())=<class 'tuple'>
type(ser[ser.astype(str).str.len().idxmax()])=<class 'numpy.int64'>
使用来自相同数据帧(相同数据)(n=100) 的长列,我得到了一个系列(不是预期的??)
long = df.head(100)
long_return = maxstr(long['CID'])
type(ser)=<class 'pandas.core.series.Series'>
type(ser.astype(str).str.len().idxmax())=<class 'tuple'>
type(ser[ser.astype(str).str.len().idxmax()])=<class 'pandas.core.series.Series'>
在这两种情况下,我们都找到相同的 int 值(但一个在一系列中,另一个作为单个值)
short_return == long_return.iloc[0]
True
int 值是唯一的,因此它在 dataframe 列中出现一次
value = short_return
print(f'The value: {value=}')
print(f'{sum(short["CID"] == value)=}')
print(f'{sum(long["CID"] == value)=}')
The value: value=1937
sum(short["CID"] == value)=1
sum(long["CID"] == value)=1
在我看来问题是重复的索引值,所以如果 idxmax
return tuple
是重复的,returned 不是标量,而是所有重复的行在选择中。
避免它的简单解决方案是创建默认索引,这里更改:
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
至:
df = pd.read_clipboard(sep='\t', na_values='')
表示没有 MultiIndex
,但默认为 RangeIndex
。
检查是否 RangeIndex
:
print (df.index)
如果需要解决方案MultiIndex
是删除重复值:
df = pd.read_clipboard(sep='\t', index_col=[0, 1, 2, 3, 4], na_values='')
df = df[~df.index.duplicated()]