计算具有多个值的列
Count columns with multiple values
我有这个数据框
df = pd.DataFrame({
"col1": ["Kev", "Kev", "Fr"],
"col2": ["Red; Purple", "Yellow; Purple; Red", "Red; Yellow"], }, index=["1", "2", "3"])
看起来像这样
col1 col2
1 Kev Red; Purple
2 Kev Yellow; Purple; Red
3 Fr Red; Yellow
我想根据col1统计col2中的所有项目。在这种情况下,最终的 df 将是这样的:
col1 col2 count
1 Kev Red 2
2 Kev Purple 2
3 Kev Yellow 1
4 Fr Red 1
5 Fr Yellow 1
我试过使用爆炸:
df2 = (df.explode(df.columns.tolist())
.apply(lambda col: col.str.split(';'))
.explode('col1')
.explode('col2'))
但这只给我所需数据帧的 col1 和 col2,而不是计数。如果我在 df2 上使用 crosstab
,我会得到一个非常不同的结果。
我设法通过 2 个嵌套的 for 循环获得了所需的输出,但我的数据框太大,加载该函数需要将近一分钟的时间。我想避免这种解决方案。
pd.crosstab
之后,可以试试melt
df2 = (df.explode(df.columns.tolist())
.apply(lambda col: col.str.split('; ')) # <-- space here
.explode('col1')
.explode('col2'))
out = (pd.crosstab(df2['col1'], df2['col2'])
.melt(value_name='count', ignore_index=False)
.reset_index())
print(out)
col1 col2 count
0 Fr Purple 0
1 Kev Purple 2
2 Fr Red 1
3 Kev Red 2
4 Fr Yellow 1
5 Kev Yellow 1
根据你的例子,你只需要在拆分字符串后爆炸col2
。
这里有一个更简单的方法,使用 DataFrame.value_counts
import pandas as pd
df = pd.DataFrame({
"col1": ["Kev", "Kev", "Fr"],
"col2": ["Red; Purple", "Yellow; Purple; Red", "Red; Yellow"], }, index=["1", "2", "3"])
df2 = (
df.assign(col2=df['col2'].str.split('; '))
.explode('col2')
.value_counts()
.rename('count')
.reset_index()
)
输出:
>>> df2
col1 col2 count
0 Kev Purple 2
1 Kev Red 2
2 Fr Red 1
3 Fr Yellow 1
4 Kev Yellow 1
我有这个数据框
df = pd.DataFrame({
"col1": ["Kev", "Kev", "Fr"],
"col2": ["Red; Purple", "Yellow; Purple; Red", "Red; Yellow"], }, index=["1", "2", "3"])
看起来像这样
col1 col2
1 Kev Red; Purple
2 Kev Yellow; Purple; Red
3 Fr Red; Yellow
我想根据col1统计col2中的所有项目。在这种情况下,最终的 df 将是这样的:
col1 col2 count
1 Kev Red 2
2 Kev Purple 2
3 Kev Yellow 1
4 Fr Red 1
5 Fr Yellow 1
我试过使用爆炸:
df2 = (df.explode(df.columns.tolist())
.apply(lambda col: col.str.split(';'))
.explode('col1')
.explode('col2'))
但这只给我所需数据帧的 col1 和 col2,而不是计数。如果我在 df2 上使用 crosstab
,我会得到一个非常不同的结果。
我设法通过 2 个嵌套的 for 循环获得了所需的输出,但我的数据框太大,加载该函数需要将近一分钟的时间。我想避免这种解决方案。
pd.crosstab
之后,可以试试melt
df2 = (df.explode(df.columns.tolist())
.apply(lambda col: col.str.split('; ')) # <-- space here
.explode('col1')
.explode('col2'))
out = (pd.crosstab(df2['col1'], df2['col2'])
.melt(value_name='count', ignore_index=False)
.reset_index())
print(out)
col1 col2 count
0 Fr Purple 0
1 Kev Purple 2
2 Fr Red 1
3 Kev Red 2
4 Fr Yellow 1
5 Kev Yellow 1
根据你的例子,你只需要在拆分字符串后爆炸col2
。
这里有一个更简单的方法,使用 DataFrame.value_counts
import pandas as pd
df = pd.DataFrame({
"col1": ["Kev", "Kev", "Fr"],
"col2": ["Red; Purple", "Yellow; Purple; Red", "Red; Yellow"], }, index=["1", "2", "3"])
df2 = (
df.assign(col2=df['col2'].str.split('; '))
.explode('col2')
.value_counts()
.rename('count')
.reset_index()
)
输出:
>>> df2
col1 col2 count
0 Kev Purple 2
1 Kev Red 2
2 Fr Red 1
3 Fr Yellow 1
4 Kev Yellow 1