拆分行值并计算来自 DataFrame 的唯一值

Splitting row values and count unique's from a DataFrame

我在标题为 参考文献 的列中有以下数据:

ABS052
ABS052/01
ABS052/02
ADA010/00
ADD005
ADD005/01
ADD005/02
ADD005/03
ADD005/04
ADD005/05
...
WOO032
WOO032/01
WOO032/02
WOO032/03
WOO045
WOO045/01
WOO045/02
WOO045/03
WOO045/04

我想知道如何拆分行值以创建包含单个引用代码和计数值的 Dataframe,例如:

Reference Count
ABS052 3
ADA010 0
ADD005 2
... ...
WOO032 3
WOO045 4

我有以下代码: df['Reference'] = df['Reference'].str.split('/')

结果:

['ABS052'],
['ABS052','01'],
['ABS052','02'],
['ABS052','03'],
...

但我不确定如何从每行列表中删除最后两位数字。

我现在想要的是在每一行中保留字符串 [0] 如果这有意义,那么我可以从 'Reference' 列中检索一个 value_count

您可以像这样使用正则表达式替换最后两位数字:

df = pd.DataFrame({'a':['ABS052','ABS052/01','ABS052/02','ADA010/00','ADD005','ADD005/01','ADD005/02','ADD005/03','ADD005/04','ADD005/05']})
df = df['a'].str.replace(r'\/\d+$', '').value_counts().reset_index()

输出:

>>>>    index   a
    0   ADD005  6
    1   ABS052  3
    2   ADA010  1

你快到了,你可以将expand=True添加到split然后使用groupby:

df['Reference'].str.split("/", expand=True).fillna("--").groupby(0).count()

returns:

        1
0        
ABS052  3
ADA010  1
ADD005  6

前几行数据。

fillna("--") 确保您也计算像 ABS052 这样没有 "" 的行,即第二列中的 None

问题中列出的预期结果似乎有问题。

假设您想放弃数字并计算前缀出现次数:

df.Reference.str.split("/", expand=True)[0].value_counts()

如果后缀有含义并且您想保留最高值,那么应该这样做

df.Reference.str.split("/", expand=True).fillna("00").astype({0: str, 1: int}).groupby(0).max()

使用列名输出到 df

df['Reference'] = df['Reference'].str.split('/').str[0]
df_counts = df['Reference'].value_counts().rename_axis('Reference').reset_index(name='Counts')

输出

  Reference  Counts
0    ADD005  6
1    ABS052  3
2    ADA010  1

解释 - 第一行给出了一个干净的系列,叫做 'Reference'。第二行给出了唯一项的计数,然后重置索引并重命名列。