拆分行值并计算来自 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'。第二行给出了唯一项的计数,然后重置索引并重命名列。
我在标题为 参考文献 的列中有以下数据:
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'。第二行给出了唯一项的计数,然后重置索引并重命名列。