在下面的代碼中,我試圖在 DataFrame 列中找到最長的字串。
根據列的長度,下面的函式 (maxstr) 為短列回傳單個值(如預期),為長列回傳單個元素系列(我沒想到會這樣)。
任何指標將不勝感激。
我使用了在 Pandas 資料框列中查找最長字串的長度中討論的方法
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')
回傳列/系列中等效的最大長度字串的函式
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 值是唯一的,因此它在資料框列中出現一次
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
uj5u.com熱心網友回復:
在我看來,問題是重復的索引值,所以如果idxmaxreturntuple是重復的,回傳的不是標量,而是選擇中的所有重復行。
避免它的簡單解決方案是創建默認索引,這里更改:
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()]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392731.html
