Python 无循环的行式操作
Python row wise operation without loops
已解决:
感谢@mozway 的帮助,我解决了我的问题。
基本上合并 df,将它们分组并将它们组合成一列 + 删除重复项。
df2 = df2.merge(df1, how='left', left_on=df2["code2_firstTwoDigits"], right_on=df1["code"])
df2['code'] = df2.groupby(['code2_firstTwoDigits'])['code'].transform(lambda x : ', '.join(x))
df2= df2.drop_duplicates()
我想按行执行操作,但我读到,作为一个 Python 新手,我不应该在 Python.
中使用循环
我有两个数据框,基本上是这样的
df1 =
code random_values code_Values
0 1234 house 3.21
1 2345 car 5.32
2 2342 white 1.00
3 2344 wolf 2.23
4 2345 black 5.00
5 3456 house 5.99
6 3422 car 3.21
7 3666 white 5.32
8 4567 wolf 1.00
9 4511 black 2.23
10 4721 red 5.00
df2 =
code2 random_values code2_firstTwoDigits
0 1264 house 12
1 2397 car 23
2 3498 white 34
3 4588 wolf 45
4 6388 black 63
我可能试图一次执行太多操作,我感觉我的大脑没有适应来自 C# 的 Python。但我想做的是:
- 在 df2
中创建列“SameCodeStructure”和“SameCodeStructure_SumOfValues”
- 遍历 df2 的所有行并在 df1["code"] 中搜索与“code2_firstTwoDigits”的值匹配的值
- 将 df1["code"] 中的值保存到 df2["SameCodeStructure"]
- 将那些匹配行的值添加到 df2["SameCodeStructure_SumOfValues"]
如果不再次混淆就很难解释,所以我尝试用视觉表示我的问题,我希望它看起来像这样:
df3 =
code2 random_values code2_firstTwoDigits SameCodeStructure SameCodeStructure_SumOfValues
0 1264 house 12 1234 3.21
1 2397 car 23 2345, 2342, 2344, 2345 13.55
2 3498 white 34 3456, 3422 9.2
3 4588 wolf 45 4567, 4511 3.23
4 6388 black 63 - -
我设法查找了单行 (3) 的匹配代码,但我正在努力寻找帮助如何将其转换为 df2 所有行的整体解决方案
pd.Series(df2[ df2["code2"].str.match (df1.iloc[3]["code_Values"] ) ]["code2"]).str.cat(sep=", ", others=None)
感谢所有的建议。
Python 对我来说,在“编写代码量”方面似乎更容易,但在“更少代码”方面确实很难思考
输出的确切逻辑不清楚,但你想要 merge
和 groupby
+agg
:
(df1.merge(df2, left_on=df1['code']//100, right_on='code2_firstTwoDigits', suffixes=('', '_2'))
.groupby('code2_firstTwoDigits')
.agg({'code_Values': 'sum',
'code': list,
'random_values': 'first'})
)
输出:
code_Values code random_values
code2_firstTwoDigits
12 3.21 [1234] house
23 13.55 [2345, 2342, 2344, 2345] car
34 9.20 [3456, 3422] house
45 3.23 [4567, 4511] wolf
已解决: 感谢@mozway 的帮助,我解决了我的问题。 基本上合并 df,将它们分组并将它们组合成一列 + 删除重复项。
df2 = df2.merge(df1, how='left', left_on=df2["code2_firstTwoDigits"], right_on=df1["code"])
df2['code'] = df2.groupby(['code2_firstTwoDigits'])['code'].transform(lambda x : ', '.join(x))
df2= df2.drop_duplicates()
我想按行执行操作,但我读到,作为一个 Python 新手,我不应该在 Python.
中使用循环我有两个数据框,基本上是这样的
df1 =
code random_values code_Values
0 1234 house 3.21
1 2345 car 5.32
2 2342 white 1.00
3 2344 wolf 2.23
4 2345 black 5.00
5 3456 house 5.99
6 3422 car 3.21
7 3666 white 5.32
8 4567 wolf 1.00
9 4511 black 2.23
10 4721 red 5.00
df2 =
code2 random_values code2_firstTwoDigits
0 1264 house 12
1 2397 car 23
2 3498 white 34
3 4588 wolf 45
4 6388 black 63
我可能试图一次执行太多操作,我感觉我的大脑没有适应来自 C# 的 Python。但我想做的是:
- 在 df2 中创建列“SameCodeStructure”和“SameCodeStructure_SumOfValues”
- 遍历 df2 的所有行并在 df1["code"] 中搜索与“code2_firstTwoDigits”的值匹配的值
- 将 df1["code"] 中的值保存到 df2["SameCodeStructure"]
- 将那些匹配行的值添加到 df2["SameCodeStructure_SumOfValues"]
如果不再次混淆就很难解释,所以我尝试用视觉表示我的问题,我希望它看起来像这样:
df3 =
code2 random_values code2_firstTwoDigits SameCodeStructure SameCodeStructure_SumOfValues
0 1264 house 12 1234 3.21
1 2397 car 23 2345, 2342, 2344, 2345 13.55
2 3498 white 34 3456, 3422 9.2
3 4588 wolf 45 4567, 4511 3.23
4 6388 black 63 - -
我设法查找了单行 (3) 的匹配代码,但我正在努力寻找帮助如何将其转换为 df2 所有行的整体解决方案
pd.Series(df2[ df2["code2"].str.match (df1.iloc[3]["code_Values"] ) ]["code2"]).str.cat(sep=", ", others=None)
感谢所有的建议。 Python 对我来说,在“编写代码量”方面似乎更容易,但在“更少代码”方面确实很难思考
输出的确切逻辑不清楚,但你想要 merge
和 groupby
+agg
:
(df1.merge(df2, left_on=df1['code']//100, right_on='code2_firstTwoDigits', suffixes=('', '_2'))
.groupby('code2_firstTwoDigits')
.agg({'code_Values': 'sum',
'code': list,
'random_values': 'first'})
)
输出:
code_Values code random_values
code2_firstTwoDigits
12 3.21 [1234] house
23 13.55 [2345, 2342, 2344, 2345] car
34 9.20 [3456, 3422] house
45 3.23 [4567, 4511] wolf