Skip to content

Commit 4f3ccae

Browse files
authored
feat: add pandas solutions to lc problems: No.3056~3060 (#2389)
1 parent e8a57ef commit 4f3ccae

File tree

15 files changed

+282
-0
lines changed

15 files changed

+282
-0
lines changed

solution/3000-3099/3056.Snaps Analysis/README.md

+24
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,30 @@ FROM
116116
GROUP BY 1;
117117
```
118118

119+
```python
120+
import pandas as pd
121+
122+
123+
def snap_analysis(activities: pd.DataFrame, age: pd.DataFrame) -> pd.DataFrame:
124+
merged_df = pd.merge(activities, age, on="user_id")
125+
total_time_per_age_activity = (
126+
merged_df.groupby(["age_bucket", "activity_type"])["time_spent"]
127+
.sum()
128+
.reset_index()
129+
)
130+
pivot_df = total_time_per_age_activity.pivot(
131+
index="age_bucket", columns="activity_type", values="time_spent"
132+
).reset_index()
133+
pivot_df = pivot_df.fillna(0)
134+
pivot_df["send_perc"] = round(
135+
100 * pivot_df["send"] / (pivot_df["send"] + pivot_df["open"]), 2
136+
)
137+
pivot_df["open_perc"] = round(
138+
100 * pivot_df["open"] / (pivot_df["send"] + pivot_df["open"]), 2
139+
)
140+
return pivot_df[["age_bucket", "send_perc", "open_perc"]]
141+
```
142+
119143
<!-- tabs:end -->
120144

121145
<!-- end -->

solution/3000-3099/3056.Snaps Analysis/README_EN.md

+24
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,30 @@ FROM
114114
GROUP BY 1;
115115
```
116116

117+
```python
118+
import pandas as pd
119+
120+
121+
def snap_analysis(activities: pd.DataFrame, age: pd.DataFrame) -> pd.DataFrame:
122+
merged_df = pd.merge(activities, age, on="user_id")
123+
total_time_per_age_activity = (
124+
merged_df.groupby(["age_bucket", "activity_type"])["time_spent"]
125+
.sum()
126+
.reset_index()
127+
)
128+
pivot_df = total_time_per_age_activity.pivot(
129+
index="age_bucket", columns="activity_type", values="time_spent"
130+
).reset_index()
131+
pivot_df = pivot_df.fillna(0)
132+
pivot_df["send_perc"] = round(
133+
100 * pivot_df["send"] / (pivot_df["send"] + pivot_df["open"]), 2
134+
)
135+
pivot_df["open_perc"] = round(
136+
100 * pivot_df["open"] / (pivot_df["send"] + pivot_df["open"]), 2
137+
)
138+
return pivot_df[["age_bucket", "send_perc", "open_perc"]]
139+
```
140+
117141
<!-- tabs:end -->
118142

119143
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pandas as pd
2+
3+
4+
def snap_analysis(activities: pd.DataFrame, age: pd.DataFrame) -> pd.DataFrame:
5+
merged_df = pd.merge(activities, age, on="user_id")
6+
total_time_per_age_activity = (
7+
merged_df.groupby(["age_bucket", "activity_type"])["time_spent"]
8+
.sum()
9+
.reset_index()
10+
)
11+
pivot_df = total_time_per_age_activity.pivot(
12+
index="age_bucket", columns="activity_type", values="time_spent"
13+
).reset_index()
14+
pivot_df = pivot_df.fillna(0)
15+
pivot_df["send_perc"] = round(
16+
100 * pivot_df["send"] / (pivot_df["send"] + pivot_df["open"]), 2
17+
)
18+
pivot_df["open_perc"] = round(
19+
100 * pivot_df["open"] / (pivot_df["send"] + pivot_df["open"]), 2
20+
)
21+
return pivot_df[["age_bucket", "send_perc", "open_perc"]]

solution/3000-3099/3057.Employees Project Allocation/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,24 @@ WHERE workload > avg_workload
114114
ORDER BY 1, 2;
115115
```
116116

117+
```python
118+
import pandas as pd
119+
120+
121+
def employees_with_above_avg_workload(
122+
project: pd.DataFrame, employees: pd.DataFrame
123+
) -> pd.DataFrame:
124+
merged_df = pd.merge(project, employees, on="employee_id")
125+
avg_workload_per_team = merged_df.groupby("team")["workload"].mean().reset_index()
126+
merged_df = pd.merge(
127+
merged_df, avg_workload_per_team, on="team", suffixes=("", "_avg")
128+
)
129+
ans = merged_df[merged_df["workload"] > merged_df["workload_avg"]]
130+
ans = ans[["employee_id", "project_id", "name", "workload"]]
131+
ans = ans.rename(columns={"name": "employee_name", "workload": "project_workload"})
132+
return ans.sort_values(by=["employee_id", "project_id"])
133+
```
134+
117135
<!-- tabs:end -->
118136

119137
<!-- end -->

solution/3000-3099/3057.Employees Project Allocation/README_EN.md

+18
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,24 @@ WHERE workload > avg_workload
112112
ORDER BY 1, 2;
113113
```
114114

115+
```python
116+
import pandas as pd
117+
118+
119+
def employees_with_above_avg_workload(
120+
project: pd.DataFrame, employees: pd.DataFrame
121+
) -> pd.DataFrame:
122+
merged_df = pd.merge(project, employees, on="employee_id")
123+
avg_workload_per_team = merged_df.groupby("team")["workload"].mean().reset_index()
124+
merged_df = pd.merge(
125+
merged_df, avg_workload_per_team, on="team", suffixes=("", "_avg")
126+
)
127+
ans = merged_df[merged_df["workload"] > merged_df["workload_avg"]]
128+
ans = ans[["employee_id", "project_id", "name", "workload"]]
129+
ans = ans.rename(columns={"name": "employee_name", "workload": "project_workload"})
130+
return ans.sort_values(by=["employee_id", "project_id"])
131+
```
132+
115133
<!-- tabs:end -->
116134

117135
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import pandas as pd
2+
3+
4+
def employees_with_above_avg_workload(
5+
project: pd.DataFrame, employees: pd.DataFrame
6+
) -> pd.DataFrame:
7+
merged_df = pd.merge(project, employees, on="employee_id")
8+
avg_workload_per_team = merged_df.groupby("team")["workload"].mean().reset_index()
9+
merged_df = pd.merge(
10+
merged_df, avg_workload_per_team, on="team", suffixes=("", "_avg")
11+
)
12+
ans = merged_df[merged_df["workload"] > merged_df["workload_avg"]]
13+
ans = ans[["employee_id", "project_id", "name", "workload"]]
14+
ans = ans.rename(columns={"name": "employee_name", "workload": "project_workload"})
15+
return ans.sort_values(by=["employee_id", "project_id"])

solution/3000-3099/3058.Friends With No Mutual Friends/README.md

+26
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,32 @@ WHERE
9090
ORDER BY 1, 2;
9191
```
9292

93+
```python
94+
import pandas as pd
95+
96+
97+
def friends_with_no_mutual_friends(friends: pd.DataFrame) -> pd.DataFrame:
98+
cp = friends.copy()
99+
t = cp[["user_id1", "user_id2"]].copy()
100+
t = pd.concat(
101+
[
102+
t,
103+
cp[["user_id2", "user_id1"]].rename(
104+
columns={"user_id2": "user_id1", "user_id1": "user_id2"}
105+
),
106+
]
107+
)
108+
merged = t.merge(t, left_on="user_id2", right_on="user_id2")
109+
ans = cp[
110+
~cp.apply(
111+
lambda x: (x["user_id1"], x["user_id2"])
112+
in zip(merged["user_id1_x"], merged["user_id1_y"]),
113+
axis=1,
114+
)
115+
]
116+
return ans.sort_values(by=["user_id1", "user_id2"])
117+
```
118+
93119
<!-- tabs:end -->
94120

95121
<!-- end -->

solution/3000-3099/3058.Friends With No Mutual Friends/README_EN.md

+26
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,32 @@ WHERE
8888
ORDER BY 1, 2;
8989
```
9090

91+
```python
92+
import pandas as pd
93+
94+
95+
def friends_with_no_mutual_friends(friends: pd.DataFrame) -> pd.DataFrame:
96+
cp = friends.copy()
97+
t = cp[["user_id1", "user_id2"]].copy()
98+
t = pd.concat(
99+
[
100+
t,
101+
cp[["user_id2", "user_id1"]].rename(
102+
columns={"user_id2": "user_id1", "user_id1": "user_id2"}
103+
),
104+
]
105+
)
106+
merged = t.merge(t, left_on="user_id2", right_on="user_id2")
107+
ans = cp[
108+
~cp.apply(
109+
lambda x: (x["user_id1"], x["user_id2"])
110+
in zip(merged["user_id1_x"], merged["user_id1_y"]),
111+
axis=1,
112+
)
113+
]
114+
return ans.sort_values(by=["user_id1", "user_id2"])
115+
```
116+
91117
<!-- tabs:end -->
92118

93119
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import pandas as pd
2+
3+
4+
def friends_with_no_mutual_friends(friends: pd.DataFrame) -> pd.DataFrame:
5+
cp = friends.copy()
6+
t = cp[["user_id1", "user_id2"]].copy()
7+
t = pd.concat(
8+
[
9+
t,
10+
cp[["user_id2", "user_id1"]].rename(
11+
columns={"user_id2": "user_id1", "user_id1": "user_id2"}
12+
),
13+
]
14+
)
15+
merged = t.merge(t, left_on="user_id2", right_on="user_id2")
16+
ans = cp[
17+
~cp.apply(
18+
lambda x: (x["user_id1"], x["user_id2"])
19+
in zip(merged["user_id1_x"], merged["user_id1_y"]),
20+
axis=1,
21+
)
22+
]
23+
return ans.sort_values(by=["user_id1", "user_id2"])

solution/3000-3099/3059.Find All Unique Email Domains/README.md

+15
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,21 @@ GROUP BY 1
7272
ORDER BY 1;
7373
```
7474

75+
```python
76+
import pandas as pd
77+
78+
79+
def find_unique_email_domains(emails: pd.DataFrame) -> pd.DataFrame:
80+
emails["email_domain"] = emails["email"].str.split("@").str[-1]
81+
emails = emails[emails["email"].str.contains(".com")]
82+
return (
83+
emails.groupby("email_domain")
84+
.size()
85+
.reset_index(name="count")
86+
.sort_values(by="email_domain")
87+
)
88+
```
89+
7590
<!-- tabs:end -->
7691

7792
<!-- end -->

solution/3000-3099/3059.Find All Unique Email Domains/README_EN.md

+15
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,21 @@ GROUP BY 1
7070
ORDER BY 1;
7171
```
7272

73+
```python
74+
import pandas as pd
75+
76+
77+
def find_unique_email_domains(emails: pd.DataFrame) -> pd.DataFrame:
78+
emails["email_domain"] = emails["email"].str.split("@").str[-1]
79+
emails = emails[emails["email"].str.contains(".com")]
80+
return (
81+
emails.groupby("email_domain")
82+
.size()
83+
.reset_index(name="count")
84+
.sort_values(by="email_domain")
85+
)
86+
```
87+
7388
<!-- tabs:end -->
7489

7590
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import pandas as pd
2+
3+
4+
def find_unique_email_domains(emails: pd.DataFrame) -> pd.DataFrame:
5+
emails["email_domain"] = emails["email"].str.split("@").str[-1]
6+
emails = emails[emails["email"].str.contains(".com")]
7+
return (
8+
emails.groupby("email_domain")
9+
.size()
10+
.reset_index(name="count")
11+
.sort_values(by="email_domain")
12+
)

solution/3000-3099/3060.User Activities within Time Bounds/README.md

+16
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,22 @@ FROM T
9393
WHERE TIMESTAMPDIFF(HOUR, prev_session_end, session_start) <= 12;
9494
```
9595

96+
```python
97+
import pandas as pd
98+
99+
100+
def user_activities(sessions: pd.DataFrame) -> pd.DataFrame:
101+
sessions = sessions.sort_values(by=["user_id", "session_start"])
102+
sessions["prev_session_end"] = sessions.groupby(["user_id", "session_type"])[
103+
"session_end"
104+
].shift(1)
105+
sessions_filtered = sessions[
106+
sessions["session_start"] - sessions["prev_session_end"]
107+
<= pd.Timedelta(hours=12)
108+
]
109+
return pd.DataFrame({"user_id": sessions_filtered["user_id"].unique()})
110+
```
111+
96112
<!-- tabs:end -->
97113

98114
<!-- end -->

solution/3000-3099/3060.User Activities within Time Bounds/README_EN.md

+16
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ FROM T
9191
WHERE TIMESTAMPDIFF(HOUR, prev_session_end, session_start) <= 12;
9292
```
9393

94+
```python
95+
import pandas as pd
96+
97+
98+
def user_activities(sessions: pd.DataFrame) -> pd.DataFrame:
99+
sessions = sessions.sort_values(by=["user_id", "session_start"])
100+
sessions["prev_session_end"] = sessions.groupby(["user_id", "session_type"])[
101+
"session_end"
102+
].shift(1)
103+
sessions_filtered = sessions[
104+
sessions["session_start"] - sessions["prev_session_end"]
105+
<= pd.Timedelta(hours=12)
106+
]
107+
return pd.DataFrame({"user_id": sessions_filtered["user_id"].unique()})
108+
```
109+
94110
<!-- tabs:end -->
95111

96112
<!-- end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import pandas as pd
2+
3+
4+
def user_activities(sessions: pd.DataFrame) -> pd.DataFrame:
5+
sessions = sessions.sort_values(by=["user_id", "session_start"])
6+
sessions["prev_session_end"] = sessions.groupby(["user_id", "session_type"])[
7+
"session_end"
8+
].shift(1)
9+
sessions_filtered = sessions[
10+
sessions["session_start"] - sessions["prev_session_end"]
11+
<= pd.Timedelta(hours=12)
12+
]
13+
return pd.DataFrame({"user_id": sessions_filtered["user_id"].unique()})

0 commit comments

Comments
 (0)