数据框不同行之间的乘法
Multiplication between different rows of a dataframe
我有几个这样的数据框:
time_hr
cell_hour
id
attitude
hour
0.028611
xxx
1
Cruise
1.0
0.028333
xxx
4
Cruise
1.0
0.004722
xxx
16
Cruise
1.0
我想在 'time_hr' 列的行之间进行特定的乘法运算。
我需要将每一行与其他行相乘并存储值以备后用。
例如。如果列值为 [2,3,4],我需要 2x3、2x4、3x2、3x4、4x2、4x3 值。
部分问题是我有几个行数不同的数据框,所以我需要一种通用的方法来做到这一点。
有办法吗?提前致谢。
对我来说这听起来像是笛卡尔积:
from io import StringIO
#sample data reading
data1 = """
time_hr cell_hour id attitude hour
0.028611 xxx 1 Cruise 1.0
0.028333 xxx 4 Cruise 1.0
0.004722 xxx 16 Cruise 1.0
"""
df = pd.read_csv(StringIO(data1), sep="\t")
#filtering dataset to needed columns
df_time = df[["id", "time_hr"]]
df_comb = df_time.merge(df_time, how='cross')
df_comb = df_comb[df_comb["id_x"] != df_comb["id_y"]]
df_comb["time_hr"] = df_comb["time_hr_x"] * df_comb["time_hr_y"]
df_comb.drop(columns=["time_hr_x", "time_hr_y"]).set_index(["id_x", "id_y"])
# time_hr
#id_x id_y
#1 4 0.000811
# 16 0.000135
#4 1 0.000811
# 16 0.000134
#16 1 0.000135
# 4 0.000134
如果你想拥有更多 pythonic 代码,你可以将其自动化
id_column = "id"
product_columns = ["time_hr"]
df_time = df[[id_column, *product_columns]]
df_comb = df_time.merge(df_time, how='cross')
df_comb = df_comb[df_comb[f"{id_column}_x"] != df_comb[f"{id_column}_y"]]
for column in product_columns:
df_comb[column] = df_comb[f"{column}_x"] * df_comb[f"{column}_y"]
df_comb.set_index([f"{id_column}_x", f"{id_column}_y"])\
.drop(columns=[drop for column in product_columns for drop in [f"{column}_x", f"{column}_y"]])
PS。我不确定这是否是您想要实现的目标,如果不是,请为这 3 个输入行添加预期的输出数据。
我有几个这样的数据框:
time_hr | cell_hour | id | attitude | hour |
---|---|---|---|---|
0.028611 | xxx | 1 | Cruise | 1.0 |
0.028333 | xxx | 4 | Cruise | 1.0 |
0.004722 | xxx | 16 | Cruise | 1.0 |
我想在 'time_hr' 列的行之间进行特定的乘法运算。
我需要将每一行与其他行相乘并存储值以备后用。
例如。如果列值为 [2,3,4],我需要 2x3、2x4、3x2、3x4、4x2、4x3 值。
部分问题是我有几个行数不同的数据框,所以我需要一种通用的方法来做到这一点。
有办法吗?提前致谢。
对我来说这听起来像是笛卡尔积:
from io import StringIO
#sample data reading
data1 = """
time_hr cell_hour id attitude hour
0.028611 xxx 1 Cruise 1.0
0.028333 xxx 4 Cruise 1.0
0.004722 xxx 16 Cruise 1.0
"""
df = pd.read_csv(StringIO(data1), sep="\t")
#filtering dataset to needed columns
df_time = df[["id", "time_hr"]]
df_comb = df_time.merge(df_time, how='cross')
df_comb = df_comb[df_comb["id_x"] != df_comb["id_y"]]
df_comb["time_hr"] = df_comb["time_hr_x"] * df_comb["time_hr_y"]
df_comb.drop(columns=["time_hr_x", "time_hr_y"]).set_index(["id_x", "id_y"])
# time_hr
#id_x id_y
#1 4 0.000811
# 16 0.000135
#4 1 0.000811
# 16 0.000134
#16 1 0.000135
# 4 0.000134
如果你想拥有更多 pythonic 代码,你可以将其自动化
id_column = "id"
product_columns = ["time_hr"]
df_time = df[[id_column, *product_columns]]
df_comb = df_time.merge(df_time, how='cross')
df_comb = df_comb[df_comb[f"{id_column}_x"] != df_comb[f"{id_column}_y"]]
for column in product_columns:
df_comb[column] = df_comb[f"{column}_x"] * df_comb[f"{column}_y"]
df_comb.set_index([f"{id_column}_x", f"{id_column}_y"])\
.drop(columns=[drop for column in product_columns for drop in [f"{column}_x", f"{column}_y"]])
PS。我不确定这是否是您想要实现的目标,如果不是,请为这 3 个输入行添加预期的输出数据。