Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 根据条件为列指定值_Pandas_Apache Spark_Dataframe_Pyspark_Conditional Statements - Fatal编程技术网

Pandas 根据条件为列指定值

Pandas 根据条件为列指定值,pandas,apache-spark,dataframe,pyspark,conditional-statements,Pandas,Apache Spark,Dataframe,Pyspark,Conditional Statements,我正在使用pyspark解析大量数据。我有一个dataframe,它有以下列 ip\u地址 device\u id 位置 设备类型 我想创建一个名为id的新列,并将id的相同值分配给满足以下条件之一的列 1) 它们具有相同的设备id和ip\u地址 2) 它们具有相同的设备id,位置和设备类型 3) 它们具有相同的ip\u地址,位置和设备类型 基本上,我希望根据上述条件找到表示相同设备的所有行,并为它们提供相同的id 假设我有以下专栏 +--------+-----------+--------

我正在使用pyspark解析大量数据。我有一个dataframe,它有以下列

ip\u地址
device\u id
位置
设备类型

我想创建一个名为
id
的新列,并将
id
的相同值分配给满足以下条件之一的列

1) 它们具有相同的
设备id
ip\u地址

2) 它们具有相同的
设备id
位置
设备类型

3) 它们具有相同的
ip\u地址
位置
设备类型

基本上,我希望根据上述条件找到表示相同设备的所有行,并为它们提供相同的id

假设我有以下专栏


+--------+-----------+------------+-----------+-------------+
|编号|设备| id | ip |地址|位置|设备|类型|
+--------+-----------+------------+-----------+-------------+
|1 |设备1 | ip1 |位置1 |类型1|
|2 |设备1 | ip1 |位置1 |类型1|
|3 |设备1 | ip2 |位置1 |类型1|
|4 |设备2 | ip1 |位置1 |类型1|
|5 |设备3 | ip3 |位置2 |类型2|
+--------+-----------+------------+-----------+-------------+

前4行应分配相同的
id
,因为每行满足三个条件之一

第1行和第2行满足条件1

第2行和第3行满足条件2

第3行和第4行满足条件3

所以输出应该是


+--------+-----------+------------+-----------+-------------+----+
|编号|设备| id | ip |地址|位置|设备|类型| id|
+--------+-----------+------------+-----------+-------------+----+
|1 |设备1 | ip1 |位置1 |类型1 | 1|
|2 |设备1 | ip1 |位置1 |类型1 | 1|
|3 |设备1 | ip2 |位置1 |类型1 | 1|
|4 |设备2 | ip1 |位置1 |类型1 | 1|
|5 |设备3 | ip3 |位置2 |类型2 | 2|
+--------+-----------+------------+-----------+-------------+----+


这有可能实现吗?如果是这样,我该怎么做

你可以这样做。不确定这是否是理想的方法,但它确实有效:

df=spark.createDataFrame([
(“1”、“设备1”、“ip1”、“位置1”、“类型1”),
(“2”、“设备1”、“ip1”、“位置1”、“类型1”),
(“3”、“设备1”、“ip2”、“位置1”、“类型1”),
(“4”、“设备2”、“ip1”、“位置1”、“类型1”),
(“5”、“设备3”、“ip3”、“位置2”、“类型2”)
](“ip地址”、“设备id”、“位置”、“设备类型”))
df1=df.groupBy(“设备id”、“ip地址”).agg(最小(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“ip地址”)。别名(“ip”)、列(“最小(列(“编号”))。别名(“id1”))
df2=df.groupBy(“设备id”、“位置”、“设备类型”).agg(最小值(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“数据类型”)、列(“最小值(列)”。别名(“id2”))
df3=df.groupBy(“ip地址”、“位置”、“设备类型”).agg(最小(列(“编号”)))。选择(列(“ip地址”)。别名(“ip”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“d类型”)、列(“最小(列(“编号”)。别名(“id3”))
df.join(df1,[(df1.d\u id==df.device\u id)和(df1.ip==df.ip\u address)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).连接(df2,[(df2.d\u id==df.device\u id)和(df2.l==df.location)和(df2.d\u类型==df.device\u类型)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).join(df3,[(df3.ip==df.ip\u address)和(df3.l==df.location)和(df3.d\u type==df.device\u type)],how=“inner”)。选择(“编号”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”、“id2”、“id3”)。带列(“id”,最少(列(“id1”)、列(“id2”)、列(“id3”)。show()
连接条件表示所需的条件。结果显示在最后的
id
列中,如下所示:

+------+---------+----------+---------+-----------+---+---+---+---+  
|number|device_id|ip_address| location|device_type|id1|id2|id3| id| 
+------+---------+----------+---------+-----------+---+---+---+---+ 
| 5    | device3 | ip3      |location2| type2     | 5 | 5 | 5 | 5 | 
| 3    | device1 | ip2      |location1| type1     | 3 | 1 | 3 | 1 | 
| 4    | device2 | ip1      |location1| type1     | 4 | 4 | 1 | 1 | 
| 1    | device1 | ip1      |location1| type1     | 1 | 1 | 1 | 1 | 
| 2    | device1 | ip1      |location1| type1     | 1 | 1 | 1 | 1 | 
+------+---------+----------+---------+-----------+---+---+---+---+

你可以做到。不确定这是否是理想的方法,但它确实有效:

df=spark.createDataFrame([
(“1”、“设备1”、“ip1”、“位置1”、“类型1”),
(“2”、“设备1”、“ip1”、“位置1”、“类型1”),
(“3”、“设备1”、“ip2”、“位置1”、“类型1”),
(“4”、“设备2”、“ip1”、“位置1”、“类型1”),
(“5”、“设备3”、“ip3”、“位置2”、“类型2”)
](“ip地址”、“设备id”、“位置”、“设备类型”))
df1=df.groupBy(“设备id”、“ip地址”).agg(最小(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“ip地址”)。别名(“ip”)、列(“最小(列(“编号”))。别名(“id1”))
df2=df.groupBy(“设备id”、“位置”、“设备类型”).agg(最小值(列(“编号”)))。选择(列(“设备id”)。别名(“数据id”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“数据类型”)、列(“最小值(列)”。别名(“id2”))
df3=df.groupBy(“ip地址”、“位置”、“设备类型”).agg(最小(列(“编号”)))。选择(列(“ip地址”)。别名(“ip”)、列(“位置”)。别名(“l”)、列(“设备类型”)。别名(“d类型”)、列(“最小(列(“编号”)。别名(“id3”))
df.join(df1,[(df1.d\u id==df.device\u id)和(df1.ip==df.ip\u address)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).连接(df2,[(df2.d\u id==df.device\u id)和(df2.l==df.location)和(df2.d\u类型==df.device\u类型)],how=“inner”).选择(“数字”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”).join(df3,[(df3.ip==df.ip\u address)和(df3.l==df.location)和(df3.d\u type==df.device\u type)],how=“inner”)。选择(“编号”、“设备id”、“ip地址”、“位置”、“设备类型”、“id1”、“id2”、“id3”)。带列(“id”,最少(列(“id1”)、列(“id2”)、列(“id3”)。show()
工作