我有一个大约有100列和30000行的表.看起来像这样:
site_id cell_id sector_id value1 value2
1 1 1 70 23
1 2 1 40 20
1 3 1 67 35
1 5 2 42 60
1 6 2 65 30
1 7 2 62 62
2 11 1 67 11
2 12 1 45 22
2 13 1 65 15
Run Code Online (Sandbox Code Playgroud)
对于一个site_id的相同sector_id,如果value1> = 65,那么value2 <25的相同扇区中的任何cell_id将被归类为"LOW_LOAD_CELL".期望的输出将是:
site_id cell_id sector_id value1 value2 cell_status
1 1 1 70 23 LOW_LOAD_CELL
1 2 1 40 20 LOW_LOAD_CELL
1 3 1 67 35
1 5 …
Run Code Online (Sandbox Code Playgroud) 我需要得到所有后代用side_a - side_b(在一个数据帧中)表示的链接,直到达到每个side_a他们的end_point(在其他数据帧中).所以:
df1:
side_a side_b
a b
b c
c d
k l
l m
l n
p q
q r
r s
df2:
side_a end_point
a c
b c
c c
k m
k n
l m
l n
p s
q s
r s
Run Code Online (Sandbox Code Playgroud)
关键是获取每个side_a值的所有点,直到从df2到达该值的end_point.如果它有两个end_point值(如"k"那样),它应该是两个列表.
我有一些代码,但它不是用这种方法编写的,它会从df1中删除所有行,如果df1['side_a'] == df2['end_points']
这会导致某些问题.但是,如果有人要我发布代码,我当然会.
期望的输出将是这样的:
side_a end_point
a [b, c]
b [c]
c [c]
k [l, m]
k [l, n]
l [m]
l [n]
p [q, r, s]
q [r, s] …
Run Code Online (Sandbox Code Playgroud) 从HDFS到本地获取数据时遇到问题。我有例如:
/path/to/folder/report1/report1_2019_03_24-03_10*.csv
/path/to/folder/report1/report1_2019_03_24-04_12*.csv
...
/path/to/folder/report1/report1_2019_03_25-05_12*.csv
/path/to/folder/report1/report1_2019_03_25-06_12*.csv
/path/to/folder/report1/report1_2019_03_25-07_11*.csv
/path/to/folder/report1/report1_2019_03_25-08_13*.csv
/path/to/folder/report2/report2_out_2019_03_25-05_12*.csv
/path/to/folder/report2/report2_out_2019_03_25-06_11*.csv
/path/to/folder/report3/report3_TH_2019_03_25-05_12*.csv
Run Code Online (Sandbox Code Playgroud)
因此,我需要输入每个文件夹(report1,report2,report3 ...,但并非所有文件夹都以“ report”开头),然后输入从先前24小时复制到本地的CSV文件,并且应该每天早晨4点完成是(我可以使用crontab安排它)。问题是我不知道如何遍历文件并将时间戳记作为参数传递。
我已经尝试过类似的东西(在Stack Overflow上找到)
/datalake/hadoop/bin/hadoop fs -ls /path/to/folder/report1/report1/* | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk 'BEGIN{ MIN=1440; LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(NOW > DIFF){ print "Migrating: "$3; system("datalake/hadoop/bin/hadoop fs -copyToLocal /path/to/local_dir/"$3) }}'
Run Code Online (Sandbox Code Playgroud)
但这是复制比我早几天的文件,并且仅从一个目录(在本例中为report1)复制文件。
有什么方法可以使此操作更加灵活和正确。如果可以使用bash而不是Python来解决问题,那就太好了。任何建议都欢迎或链接到具有类似问题的良好答案。
另外,也不必处于某个循环中。我可以为每个报告使用分隔的代码行。
我在获取pandas数据框中某些行的最近值并用这些行中的值填充另一列时遇到问题。
我有数据样本:
id su_id r_value match_v
A A1 0 1
A A2 0 1
A A3 70 2
A A4 120 100
A A5 250 3
A A6 250 100
B B1 0 1
B B2 30 2
Run Code Online (Sandbox Code Playgroud)
关键是,无论哪里match_v
等于100
,我都需要将其替换为最接近原始行(其中等于)100
的行中的值,而只是将组(按id分组)r_value
r_value
match_v
100
预期产量
id su_id r_value match_v
A A1 0 1
A A2 0 1
A A3 70 2
A A4 120 2
A A5 250 3
A A6 250 3
B B1 …
Run Code Online (Sandbox Code Playgroud) 我有这样的数据帧,数据:
Site code Col1 Col2 Col3
A5252 24 53 NaN
A5636 36 NaN NaN
A4366 NaN NaN NaN
A7578 42 785 24
Run Code Online (Sandbox Code Playgroud)
我想要计算一些具有一定价值的列,但没有NaN.期望的输出:
Site code Col1 Col2 Col3 Count
A5252 24 53 NaN 2
A5636 36 NaN NaN 1
A4366 NaN NaN NaN 0
A7578 42 785 24 3
Run Code Online (Sandbox Code Playgroud)
与此相反的东西:df = data.isnull().sum(axis = 1)
我有这样的数据帧:
Name id col1 col2 col3 cl4
PL 252 0 747 3 53
PL2 252 1 24 2 35
PL3 252 4 75 24 13
AD 889 53 24 0 95
AD2 889 23 2 0 13
AD3 889 0 24 3 6
BG 024 12 89 53 66
BG1 024 43 16 13 0
BG2 024 5 32 101 4
Run Code Online (Sandbox Code Playgroud)
现在我需要按ID进行分组,并且对于列col1和col4找到每个id的总和并将其放入靠近父列的新列中(例如:col3(sum))但是对于col2和col3,找到最大值.期望的输出:
Name id col1 col1(sum) col2 col2(max) col3 col(max) col4 col4(sum)
PL 252 0 5 747 747 3 24 …
Run Code Online (Sandbox Code Playgroud) 我有一个数据框,每个唯一的组有4行.所以我需要按列进行分组,使它们成为唯一的,并进行一些聚合,例如max,min,sum和average.但问题是我为某些组提供了所有NaN值(在某些列中)并返回0.是否有可能返回NaN?例如:df
time id el conn column1 column2 column3
2018-02-11 14:00:00 1 a 12 8 5 NaN
2018-02-11 14:00:00 1 a 12 1 NaN NaN
2018-02-11 14:00:00 1 a 12 3 7 NaN
2018-02-11 14:00:00 1 a 12 4 12 NaN
2018-02-11 14:00:00 2 a 5 NaN 5 5
2018-02-11 14:00:00 2 a 5 NaN 3 2
2018-02-11 14:00:00 2 a 5 NaN NaN 6
2018-02-11 14:00:00 2 a 5 NaN 7 NaN
Run Code Online (Sandbox Code Playgroud)
因此,例如,我需要groupby('id','el','conn')并找到column1,column3和column2的和.(在实际情况下,我需要执行更多的列聚合).我尝试了几种方法:.sum(),. transnsform('sum'),但是对于具有所有NaN值的组,我返回零.
期望的输出:
time id el conn column1 …
Run Code Online (Sandbox Code Playgroud) 我从另一个数据帧映射值时遇到问题.
这些是两个数据帧的样本:
DF1
product class_1 class_2 class_3
141A 11 13 5
53F4 12 11 18
GS24 14 12 10
Run Code Online (Sandbox Code Playgroud)
DF2
id product_type_0 product_type_1 product_type_2 product_type_3 measure_0 measure_1 measure_2 measure_3
1 141A GS24 NaN NaN 1 3 NaN NaN
2 53F4 NaN NaN NaN 1 NaN NaN NaN
3 53F4 141A 141A NaN 2 2 1 NaN
4 141A GS24 NaN NaN 3 2 NaN NaN
Run Code Online (Sandbox Code Playgroud)
我接下来要做的是:我需要添加一个名为"Max_Class_1","Max_Class_2","Max_Class_3"的新列,并且该值将从df1中获取.对于每个订单号(_1,_2,_3),请查看现有列(例如product_type_1)product_type_1,并从产品具有相同值的df1中获取一行.然后查看度量列(例如measure_1),如果值为1(原始数据中可能最多有四个不同的值),则名为"Max_Class_1"的新列将具有与该product_type的class_1相同的值,在本例中为11.
我认为这比我解释的要简单一些.
期望的输出
id product_type_0 product_type_1 product_type_2 product_type_3 measure_0 measure_1 measure_2 measure_3 max_class_0 max_class_1 max_class_2 …
Run Code Online (Sandbox Code Playgroud) 我的列的值如下:
Col1
1/1/100 'BA1
1/1/102Packe
1/1/102 'to_
Run Code Online (Sandbox Code Playgroud)
并且需要仅提取 1/1/100(从第一行)依此类推(1/1/102...)
我在用:
df['col1'] = df['col1'].str.extract('(\d+)/(\d+)/(\d+)', expand=True)
Run Code Online (Sandbox Code Playgroud)
但我只得到1。
不知道为什么这不起作用,正则表达式有问题还是我需要某种映射?
我有一个带有 PERIOD_START_TIME、ID、更多列和列 VALUE 的数据框。我需要的是按 PERIOD_START_TIME 和 ID 分组(因为按时间和 ID 有重复的行)并取列 VALUE 的最大值。df:
PERIOD_START_TIME ID VALUE
06.01.2017 02:00:00 55 ... 35
06.01.2017 02:00:00 55 ... 22
06.01.2017 03:00:00 55 ... 63
06.01.2017 03:00:00 55 ... 33
06.01.2017 04:00:00 55 ... 63
06.01.2017 04:00:00 55 ... 45
06.01.2017 02:00:00 65 ... 10
06.01.2017 02:00:00 65 ... 5
06.01.2017 03:00:00 65 ... 22
06.01.2017 03:00:00 65 ... 5
06.01.2017 04:00:00 65 ... 12
06.01.2017 04:00:00 65 ... 15
Run Code Online (Sandbox Code Playgroud)
期望的输出:
PERIOD_START_TIME ID ... VALUE …
Run Code Online (Sandbox Code Playgroud)