单元格 pandas 中的查找值和求和值
Lookup Values and sum values in cell pandas
我有两个数据框:
df1 = pd.DataFrame({'Code' : ['10', '100', '1010'],
'Value' : [25, 50, 75]})
df2 = pd.DataFrame({'ID' : ['A', 'B', 'C'],
'Codes' : ['10', '100;1010', '100'],
'Value' : [25, 125, 50]})
df2 中的“代码”列可以包含以“;”分隔的多个代码。如果是这种情况,我需要从 df1 中总结它们的值。
我试过.map(),但这对连续有多个代码的行不起作用。另外,我最终将代码“1010”转换为值“2525”。
如何为“;”指定完美匹配和求和分隔值?
explode()
代码列表
merge()
与 df1 并计算总数,根据 df2 的索引分组
- 已使用此计算结果创建了一个新列
df1 = pd.DataFrame({"Code": ["10", "100", "1010"], "Value": [25, 50, 75]})
df2 = pd.DataFrame(
{"ID": ["A", "B", "C"], "Codes": ["10", "100;1010", "100"], "Value": [25, 125, 50]}
)
df2.join(
df2["Codes"]
.str.split(";")
.explode()
.reset_index()
.merge(df1, left_on="Codes", right_on="Code")
.groupby("index")
.agg({"Value": "sum"}),
rsuffix="_calc",
)
ID
Codes
Value
Value_calc
0
A
10
25
25
1
B
100;1010
125
125
2
C
100
50
50
def sum(df1, df2):
df1['sum'] = df1['Value'] + df2['Value']
print(df1)
df1.loc[df2['Codes'].isin(df1['Code'])].apply(sum(df1, df2))
如果 df2 中的代码在 df1 中,则添加值
我们可以从 Code
查找 table 到 df1
到 Value
的映射,然后在 df2
上使用 .map()
进行映射Codes
到映射的扩展列表。最后,将相同ID
的映射值相加,得到想要的值,如下:
1.从 df1
:
中查找 Code
到 Value
的映射
mapping = df1.set_index('Code')['Value']
2。在 df2
上使用 .map()
将 Codes
的扩展列表映射到映射。将相同 ID
的映射值相加以得出所需的值:
df2a = df2.set_index('ID') # set `ID` as index
df2a['value_map'] = (
df2a['Codes'].str.split(';') # split by semicolon
.explode() # expand splitted values into rows
.map(mapping) # map Code from mapping
.groupby('ID').sum() # group sum by ID
)
df2 = df2a.reset_index() # reset `ID` from index back to data column
结果:
print(df2)
ID Codes Value value_map
0 A 10 25 25
1 B 100;1010 125 125
2 C 100 50 50
我有两个数据框:
df1 = pd.DataFrame({'Code' : ['10', '100', '1010'],
'Value' : [25, 50, 75]})
df2 = pd.DataFrame({'ID' : ['A', 'B', 'C'],
'Codes' : ['10', '100;1010', '100'],
'Value' : [25, 125, 50]})
df2 中的“代码”列可以包含以“;”分隔的多个代码。如果是这种情况,我需要从 df1 中总结它们的值。
我试过.map(),但这对连续有多个代码的行不起作用。另外,我最终将代码“1010”转换为值“2525”。
如何为“;”指定完美匹配和求和分隔值?
explode()
代码列表merge()
与 df1 并计算总数,根据 df2 的索引分组
- 已使用此计算结果创建了一个新列
df1 = pd.DataFrame({"Code": ["10", "100", "1010"], "Value": [25, 50, 75]})
df2 = pd.DataFrame(
{"ID": ["A", "B", "C"], "Codes": ["10", "100;1010", "100"], "Value": [25, 125, 50]}
)
df2.join(
df2["Codes"]
.str.split(";")
.explode()
.reset_index()
.merge(df1, left_on="Codes", right_on="Code")
.groupby("index")
.agg({"Value": "sum"}),
rsuffix="_calc",
)
ID | Codes | Value | Value_calc | |
---|---|---|---|---|
0 | A | 10 | 25 | 25 |
1 | B | 100;1010 | 125 | 125 |
2 | C | 100 | 50 | 50 |
def sum(df1, df2):
df1['sum'] = df1['Value'] + df2['Value']
print(df1)
df1.loc[df2['Codes'].isin(df1['Code'])].apply(sum(df1, df2))
如果 df2 中的代码在 df1 中,则添加值
我们可以从 Code
查找 table 到 df1
到 Value
的映射,然后在 df2
上使用 .map()
进行映射Codes
到映射的扩展列表。最后,将相同ID
的映射值相加,得到想要的值,如下:
1.从 df1
:
Code
到 Value
的映射
mapping = df1.set_index('Code')['Value']
2。在 df2
上使用 .map()
将 Codes
的扩展列表映射到映射。将相同 ID
的映射值相加以得出所需的值:
df2a = df2.set_index('ID') # set `ID` as index
df2a['value_map'] = (
df2a['Codes'].str.split(';') # split by semicolon
.explode() # expand splitted values into rows
.map(mapping) # map Code from mapping
.groupby('ID').sum() # group sum by ID
)
df2 = df2a.reset_index() # reset `ID` from index back to data column
结果:
print(df2)
ID Codes Value value_map
0 A 10 25 25
1 B 100;1010 125 125
2 C 100 50 50