{"id":237,"date":"2026-05-15T05:59:27","date_gmt":"2026-05-14T21:59:27","guid":{"rendered":"https:\/\/junai.ai\/blog\/python-pandas-21\/"},"modified":"2026-05-17T07:31:28","modified_gmt":"2026-05-16T23:31:28","slug":"python-pandas-21","status":"publish","type":"post","link":"https:\/\/junai.ai\/blog\/python-pandas-21\/","title":{"rendered":"\ud30c\uc774\uc36c pandas \uae30\ucd08 \u2014 DataFrame\u00b7groupby (21\ud3b8)"},"content":{"rendered":"\n<!-- WordPress REST API \ubc1c\ud589\uc6a9 HTML (\uc790\ub3d9 \uc0dd\uc131) -->\n<!-- WP-FEATURED-MEDIA-ID: 600 -->\n<div style=\"max-width:800px;margin:0 auto;\">\n<style>\n\/* js-textbook \u2014 PostgreSQL \uad50\uc7ac \ub3d9\uc77c \ud314\ub808\ud2b8 *\/\n:root {\n  --color-primary: #336791;\n  --color-accent: #60a5fa;\n  --color-bg: #fafafa;\n  --color-bg-card: #ffffff;\n  --color-text: #1e293b;\n  --color-text-muted: #64748b;\n  --hero-start: #0f172a;\n  --hero-end: #336791;\n  --font-body: -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;\n  --size-body: 17px;\n  --line-height: 1.75;\n}\n* { box-sizing: border-box; }\n.container { max-width: 760px; margin: 0 auto; padding: 0 22px 80px; }\n.hero { background: linear-gradient(135deg, var(--hero-start) 0%, var(--hero-end) 100%); color: #fff; padding: 72px 22px 56px; text-align: center; }\n.hero .badge { display: inline-block; background: rgba(96,165,250,0.18); color: var(--color-accent); padding: 6px 14px; border-radius: 999px; font-size: 13px; font-weight: 600; letter-spacing: 0.5px; margin-bottom: 18px; }\n.hero h1 { margin: 0 0 18px; font-size: 36px; line-height: 1.3; letter-spacing: -0.3px; }\n.hero p.sub { margin: 0 auto; max-width: 580px; font-size: 17px; color: #bfdbfe; }\n.hero img { width: 100%; max-width: 720px; height: auto; margin: 36px auto 0; display: block; border-radius: 10px; box-shadow: 0 8px 32px rgba(0,0,0,0.3); }\n.meta { display: flex; gap: 14px; justify-content: center; margin-top: 20px; font-size: 13px; color: #93c5fd; flex-wrap: wrap; }\n.meta span::before { content: \"\u00b7\"; margin-right: 14px; color: #1e3a8a; }\n.meta span:first-child::before { content: \"\"; margin: 0; }\narticle { background: var(--color-bg-card); margin-top: -36px; padding: 44px 28px; border-radius: 14px; box-shadow: 0 2px 18px rgba(0,0,0,0.06); }\narticle p { margin: 0 0 18px; }\nh2 { font-size: 28px; line-height: 1.35; letter-spacing: -0.3px; margin: 48px 0 18px; padding-bottom: 10px; border-bottom: 2px solid var(--color-primary); }\nh2:first-of-type { margin-top: 8px; }\nh3 { font-size: 21px; line-height: 1.4; margin: 30px 0 12px; color: var(--color-primary); }\ncode { background: #f1f5f9; color: #0f172a; padding: 2px 6px; border-radius: 4px; font-family: 'SFMono-Regular', Menlo, Consolas, monospace; font-size: 0.92em; }\npre { background: #0f172a; color: #e2e8f0; padding: 18px 20px; border-radius: 10px; overflow-x: auto; font-size: 14.5px; line-height: 1.65; margin: 18px 0; }\npre code { background: transparent; color: inherit; padding: 0; }\nul, ol { margin: 0 0 18px; padding-left: 24px; }\nli { margin-bottom: 8px; }\nstrong { color: #0f172a; }\n.databox { background: #eff6ff; border-left: 4px solid var(--color-primary); padding: 18px 20px; border-radius: 6px; margin: 22px 0; }\n.databox p { margin: 0 0 8px; }\n.databox p:last-child { margin: 0; }\n.databox strong { color: var(--color-primary); }\n.warnbox { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); border-left: 4px solid #d97706; padding: 18px 20px; border-radius: 6px; margin: 22px 0; }\n.warnbox strong { color: #92400e; }\n.tablewrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 22px 0; }\ntable { width: 100%; border-collapse: collapse; font-size: 15px; background: var(--color-bg-card); }\nth, td { padding: 11px 12px; text-align: left; border-bottom: 1px solid #e2e8f0; vertical-align: top; }\nth { background: #f1f5f9; font-weight: 700; color: #0f172a; }\ntd:first-child, th:first-child { font-weight: 700; }\n.cta { background: linear-gradient(135deg, #336791 0%, #60a5fa 100%); color: #fff; padding: 30px 24px; border-radius: 12px; margin-top: 44px; text-align: center; }\n.cta h3 { color: #fff; margin: 0 0 10px; }\n.cta p { margin: 0; color: #dbeafe; }\n.series-nav { background: #eff6ff; padding: 18px 22px; border-radius: 10px; margin-top: 24px; font-size: 14.5px; color: var(--color-text-muted); }\n.series-nav strong { color: var(--color-primary); }\n@media (max-width: 480px) {\n  .hero { padding: 52px 18px 44px; }\n  .hero h1 { font-size: 26px; }\n  .hero p.sub { font-size: 15px; }\n  article { padding: 28px 18px; border-radius: 10px; }\n  h2 { font-size: 22px; }\n  h3 { font-size: 18px; }\npre { font-size: 13px; padding: 14px 16px; }\n}\n@media (max-width: 560px) {\n  .tablewrap table, .tablewrap thead, .tablewrap tbody, .tablewrap tr, .tablewrap th, .tablewrap td { display: block; width: auto; }\n  .tablewrap thead { display: none; }\n  .tablewrap tr { margin: 0 0 14px; border: 1px solid #e2e8f0; border-radius: 10px; overflow: hidden; }\n  .tablewrap td { border: none; border-bottom: 1px solid #f1f5f9; padding: 9px 14px; }\n  .tablewrap td:first-child { background: #eff6ff; font-weight: 800; font-size: 15.5px; }\n  .tablewrap td:last-child { border-bottom: none; }\n  .tablewrap td[data-label]::before { content: attr(data-label) \" \u2014 \"; font-weight: 700; color: var(--color-primary); }\n}\n<\/style>\n<header class=\"hero\">\n  <span class=\"badge\">\ud30c\uc774\uc36c \uad50\uc7ac \u00b7 21\ud3b8 \/ 27\ud3b8<\/span>\n  <h1>\ud30c\uc774\uc36c pandas \uae30\ucd08 \u2014 DataFrame\u00b7groupby<\/h1>\n  <p class=\"sub\">\uc5d1\uc140\ub85c \ud558\ub8e8 \uc7a1\uc77c\uc774 \ucf54\ub4dc 5\uc904\ub85c. \ub370\uc774\ud130 \ubd84\uc11d\uc758 \uc2dc\uc791.<\/p>\n  <div class=\"meta\"><span>\uc911\uae09<\/span><span>\uc77d\ub294 \uc2dc\uac04 7\ubd84<\/span><span>2026-05-13<\/span><\/div>\n  <img decoding=\"async\" src=\"https:\/\/junai.ai\/blog\/wp-content\/uploads\/2026\/05\/hero-219.jpg\" alt=\"pandas read_csv \uc640 groupby \ub85c \ub9e4\ucd9c \ud3c9\uade0\uc744 \uad6c\ud558\ub294 \ucf54\ub4dc \ud654\uba74\">\n<\/header>\n\n<div class=\"container\">\n<article>\n\n<p>\uc5d1\uc140\uc5d0\uc11c \ub9e4\ucd9c 5\ub9cc \ud589\uc744 \uc5f4\uc5b4 SUMIF \uc640 \ud53c\ubc97 \ud14c\uc774\ube14\ub85c \ud55c \uc2dc\uac04 \uc791\uc5c5\ud558\ub294 \uac83 \u2014 pandas \uac00 \uae54\ub9ac\uba74 <strong>5-10\uc904\uc9dc\ub9ac \ud30c\uc774\uc36c \ucf54\ub4dc<\/strong>\ub85c \ub05d\ub0a9\ub2c8\ub2e4. \ub370\uc774\ud130 \uacfc\ud559\uc790\ub9cc\uc758 \ub3c4\uad6c\uac00 \uc544\ub2c8\uc5d0\uc694. \ud68c\uc0ac\uc5d0\uc11c CSV\u00b7\uc5d1\uc140\uc744 \uc790\uc8fc \ub9cc\uc9c0\ub294 \ub204\uad6c\ub4e0 \ud55c \ub2ec\uc774\uba74 \ubcf8\uc804\uc744 \ubf51\uc2b5\ub2c8\ub2e4.<\/p>\n\n<p>21\ud3b8\uc744 \ub9c8\uce58\uba74 \u2460 <code>DataFrame<\/code> \uc758 \ubcf8\uc9c8 \u2461 <code>read_csv<\/code> \uc640 \uccab \ud0d0\uc0c9 \u2462 \ud544\ud130\u00b7\uc815\ub82c\u00b7\uc0c8 \uceec\ub7fc \u2463 <code>groupby<\/code> \uc9d1\uacc4 \u2464 \uacb0\uce21\uac12(NaN) \ucc98\ub9ac \u2014 5\uac00\uc9c0\uac00 \uc190\uc5d0 \uc775\uc2b5\ub2c8\ub2e4.<\/p>\n\n<h2>DataFrame \u2014 \ud45c \ubaa8\uc591\uc758 \uc790\ub8cc\uad6c\uc870<\/h2>\n\n<pre><code>(.venv) $ pip install pandas\n\nimport pandas as pd\n\n# dict \ub85c \ub9cc\ub4e4\uae30 \u2014 list of dict \uc758 \uc9c4\ud654\ud615\ndata = {\n    \"name\": [\"\uc900\uc131\", \"\uc218\ubbfc\", \"\uc9c0\ud6c8\"],\n    \"age\": [30, 28, 35],\n    \"score\": [88, 92, 75],\n}\ndf = pd.DataFrame(data)\n#    name  age  score\n# 0  \uc900\uc131   30     88\n# 1  \uc218\ubbfc   28     92\n# 2  \uc9c0\ud6c8   35     75\n\ndf.shape          # (3, 3) \u2014 \ud589, \uc5f4\ndf.columns        # Index(['name', 'age', 'score'])\ndf.dtypes         # \uceec\ub7fc\ubcc4 \uc790\ub8cc\ud615<\/code><\/pre>\n\n<p><strong>DataFrame \uc740 \uceec\ub7fc\uc774 \ud0a4, \ud589\uc774 \uac12\uc778 \ub611\ub611\ud55c dict<\/strong>\uc785\ub2c8\ub2e4. \uac01 \uceec\ub7fc\uc774 <code>Series<\/code>(\ub611\ub611\ud55c list)\uc774\uace0, \uadf8 \ubb36\uc74c\uc774 DataFrame. 5\ud3b8\uc758 list + 6\ud3b8\uc758 dict \uac00 \ud569\uccd0\uc838 \uc9c4\ud654\ud55c \ud615\ud0dc\ub85c \uc774\ud574\ud558\uba74 \uc790\uc5f0\uc2a4\ub7ec\uc6cc\uc694.<\/p>\n\n<h2>CSV \uc77d\uae30\uc640 \uccab \ud0d0\uc0c9<\/h2>\n\n<pre><code>df = pd.read_csv(\"sales.csv\")\n\ndf.head()         # \ucc98\uc74c 5\ud589\ndf.tail(3)        # \ub9c8\uc9c0\ub9c9 3\ud589\ndf.info()         # \uceec\ub7fc\u00b7\uc790\ub8cc\ud615\u00b7\uacb0\uce21 \uc218 \ud55c\ub208\uc5d0\ndf.describe()     # \uc22b\uc790 \uceec\ub7fc\uc758 \ud3c9\uade0\u00b7\ud45c\uc900\ud3b8\ucc28\u00b7min\u00b7max\u00b7\ubd84\uc704\uc218\ndf[\"item\"].value_counts()   # \uce74\ud14c\uace0\ub9ac \uceec\ub7fc\uc758 \ube48\ub3c4\n\n# \uc5d1\uc140\ub3c4 \ud55c \uc904\ub85c\ndf = pd.read_excel(\"data.xlsx\", sheet_name=\"2026Q2\")\ndf.to_csv(\"out.csv\", index=False, encoding=\"utf-8-sig\")\n# index=False \uc548 \uc801\uc73c\uba74 0,1,2,... \uc778\ub371\uc2a4\uac00 \uceec\ub7fc\uc73c\ub85c \uc800\uc7a5\ub428<\/code><\/pre>\n\n<p><code>describe()<\/code> \uc640 <code>info()<\/code> \ub294 \uc0c8 \ub370\uc774\ud130\ub97c \ubc1b\uc73c\uba74 \uac00\uc7a5 \uba3c\uc800 \ud638\ucd9c. \ud589 \uc218\u00b7\uc790\ub8cc\ud615\u00b7\uacb0\uce21\u00b7\uc774\uc0c1\uce58\ub97c 5\ucd08\uc5d0 \ud30c\uc545\ud569\ub2c8\ub2e4.<\/p>\n\n<div class=\"databox\">\n  <p><strong>\ud83d\udccc CSV \uc778\ucf54\ub529 \ud568\uc815<\/strong><\/p>\n  <p>\ud55c\uae00 \uc5d1\uc140\uc5d0\uc11c \ub9cc\ub4e0 CSV \ub294 cp949 \ub610\ub294 utf-8-sig(BOM \ud3ec\ud568) \uc778 \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4. <code>encoding=\"utf-8\"<\/code> \ub85c \uc548 \uc77d\ud788\uba74 <code>encoding=\"cp949\"<\/code> \ub610\ub294 <code>encoding=\"utf-8-sig\"<\/code> \uc2dc\ub3c4. \uc800\uc7a5\ub3c4 <code>to_csv(..., encoding=\"utf-8-sig\")<\/code> \uac00 \uc5d1\uc140\uc5d0\uc11c \uc798 \uc5f4\ub824\uc694.<\/p>\n<\/div>\n\n<h2>\ud544\ud130\u00b7\uc815\ub82c\u00b7\uc0c8 \uceec\ub7fc<\/h2>\n\n<pre><code># \ud55c \uceec\ub7fc \uc120\ud0dd\ndf[\"score\"]              # Series \u2014 \ud55c \uceec\ub7fc\ndf[[\"name\", \"score\"]]    # DataFrame \u2014 \uc5ec\ub7ec \uceec\ub7fc\n\n# \uc870\uac74 \ud544\ud130 (boolean indexing)\ndf[df[\"score\"] &gt;= 80]\ndf[(df[\"age\"] &lt; 30) &amp; (df[\"score\"] &gt;= 80)]   # & \ub294 and, | \ub294 or, ~ \ub294 not\ndf.query(\"score &gt;= 80 and age &lt; 30\")          # \uac19\uc740 \uacb0\uacfc, SQL \uc2a4\ud0c0\uc77c\n\n# \uc815\ub82c\ndf.sort_values(\"score\", ascending=False)\ndf.sort_values([\"age\", \"score\"], ascending=[True, False])\n\n# \uc0c8 \uceec\ub7fc\ndf[\"grade\"] = df[\"score\"].apply(\n    lambda s: \"A\" if s &gt;= 90 else \"B\" if s &gt;= 80 else \"C\"\n)\ndf[\"bonus\"] = df[\"score\"] * 1.1     # \ubca1\ud130 \uc5f0\uc0b0 \u2014 for \uc548 \uc368\ub3c4 \ud589\ub9c8\ub2e4 \uc801\uc6a9<\/code><\/pre>\n\n<p><code>df[\"score\"] * 1.1<\/code> \uac19\uc740 <strong>\ubca1\ud130 \uc5f0\uc0b0<\/strong>\uc774 pandas \uc758 \uc9c4\uac00\uc785\ub2c8\ub2e4. 100\ub9cc \ud589\uc774\ub77c\ub3c4 \ud55c \uc904\ub85c \ucc98\ub9ac\ub418\uace0, \ub0b4\ubd80\uc801\uc73c\ub85c C \ub85c \ub3c4\ub294 NumPy \uac00 \uc218\uc2ed \ubc30 \ube60\ub985\ub2c8\ub2e4. \ud30c\uc774\uc36c for \ub8e8\ud504\ub85c \ub9e4\ubc88 \ucc98\ub9ac\ud558\uba74 1000\ubc30 \ucc28\uc774 \ub098\ub294 \uacbd\uc6b0\ub3c4.<\/p>\n\n<h2>groupby \u2014 \ud0a4\ubcc4 \uc9d1\uacc4<\/h2>\n\n<pre><code>df = pd.read_csv(\"sales.csv\")\n# columns: date, item, price, qty\n\n# \uc0c1\ud488\ubcc4 \ub9e4\ucd9c \ud569\ndf.groupby(\"item\")[\"price\"].sum()\n# item\n# bread     2400000\n# coffee    5400000\n\n# \uc5ec\ub7ec \uc9d1\uacc4\ub97c \ub3d9\uc2dc\uc5d0\ndf.groupby(\"item\").agg(\n    total_price=(\"price\", \"sum\"),\n    avg_qty=(\"qty\", \"mean\"),\n    rows=(\"price\", \"count\"),\n)\n\n# \ub2e4\uc911 \ud0a4\ndf.groupby([\"date\", \"item\"])[\"qty\"].sum().unstack()\n# \ub0a0\uc9dc\u00d7\uc0c1\ud488 \ud53c\ubc97 \ud14c\uc774\ube14 \u2014 \uc5d1\uc140 \ud53c\ubc97\uc774 \ud55c \uc904<\/code><\/pre>\n\n<p>19\ud3b8 <code>itertools.groupby<\/code> \uc640 \ube44\uad50\ud558\uba74 pandas \uac00 \uc555\ub3c4\uc801\uc73c\ub85c \uac15\ub825. \uc815\ub82c \ud544\uc694 \uc5c6\uace0, \uc5ec\ub7ec \uc9d1\uacc4 \ub3d9\uc2dc\uc5d0, \uacb0\uacfc\uac00 \ub2e4\uc2dc DataFrame \uc774\ub77c \uc774\uc5b4 \ucc98\ub9ac \uac00\ub2a5.<\/p>\n\n<h2>\uacb0\uce21\uac12 \ucc98\ub9ac + \ub9c8\ubb34\ub9ac<\/h2>\n\n<pre><code>df.isna().sum()              # \uceec\ub7fc\ubcc4 \uacb0\uce21 \uc218\ndf.dropna()                  # \uacb0\uce21 \uc788\ub294 \ud589 \uc81c\uac70\ndf.dropna(subset=[\"price\"])  # \ud2b9\uc815 \uceec\ub7fc\ub9cc \uae30\uc900\ndf.fillna({\"qty\": 0, \"price\": df[\"price\"].mean()})\ndf[\"item\"] = df[\"item\"].fillna(\"\ubbf8\ubd84\ub958\")<\/code><\/pre>\n\n<div class=\"warnbox\">\n  <strong>\u26a0\ufe0f \uc6d0\ubcf8\uc744 \ubc14\uafb8\uc9c0 \uc54a\ub294\ub2e4.<\/strong> <code>df.dropna()<\/code> \ub294 \uc0c8 DataFrame \uc744 \ubc18\ud658\ud558\uace0 <code>df<\/code> \uc790\uccb4\ub294 \uadf8\ub300\ub85c. \uacb0\uacfc\ub97c <code>df = df.dropna()<\/code> \ub85c \ub2e4\uc2dc \ud560\ub2f9\ud558\uac70\ub098, \uc61b \uc635\uc158 <code>inplace=True<\/code>(3.0 \uc5d0\uc11c \uc81c\uac70 \uc608\uc815\uc774\ub77c \ube44\uad8c\uc7a5)\ub97c \uc368\uc57c \uc601\uad6c \ubc18\uc601. 5\ud3b8 list \uc758 <code>sort<\/code> vs <code>sorted<\/code> \uc640 \uac19\uc740 \ud328\ud134.\n<\/div>\n\n<p>\ub2e4\uc74c \ubbf8\uc158: \u2460 \ub9e4\ucd9c CSV(7\uc77c\u00d73\uc0c1\ud488)\uc5d0\uc11c \uc0c1\ud488\ubcc4 \ucd1d \ub9e4\ucd9c \u2461 <code>describe()<\/code> \ub85c \ubcf8\uc778 \uac00\uacc4\ubd80 \ud1b5\uacc4 \u2462 \uacb0\uce21 \uc788\ub294 \uceec\ub7fc\uc744 \ud3c9\uade0\uac12\uc73c\ub85c \ucc44\uc6b0\uace0 \ub2e4\uc2dc \uc800\uc7a5.<\/p>\n\n<div class=\"cta\">\n  <h3>\ub2e4\uc74c \ud3b8 \ubbf8\ub9ac\ubcf4\uae30<\/h3>\n  <p>22\ud3b8 \u2014 &#8220;\ud30c\uc774\uc36c \uc790\ub3d9\ud654 \uc2a4\ud06c\ub9bd\ud2b8&#8221;: \uc2e4\uc804 \uc885\ud569. \uc9c0\uae08\uae4c\uc9c0 \ubc30\uc6b4 \ub3c4\uad6c\ub4e4\uc744 \ubb36\uc5b4 <em>&#8220;\ub9e4\uc77c 9\uc2dc\uc5d0 \ubcf4\uace0\uc11c \uc0dd\uc131&#8221;<\/em> \uac19\uc740 \uc77c\uc744 \ud55c \ud30c\uc77c\uc5d0.<\/p>\n<\/div>\n\n<div class=\"series-nav\">\n  <strong>\ud83d\udcda 27\ud3b8 \ud30c\uc774\uc36c \uad50\uc7ac \uc2dc\ub9ac\uc988 \u2014 21\/27\ud3b8<\/strong><br>\n  \u2190 20\ud3b8 &#8220;requests&#8221; \u00b7 \ub2e4\uc74c: 22\ud3b8 &#8220;\uc790\ub3d9\ud654 \uc2a4\ud06c\ub9bd\ud2b8&#8221;\n<\/div>\n\n<\/article>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>DataFrame\u00b7read_csv\u00b7\ud544\ud130\u00b7\uc815\ub82c\u00b7groupby\u00b7\uc9d1\uacc4\u00b7\uacb0\uce21 \ucc98\ub9ac. 27\ud3b8 \uad50\uc7ac 21\ud3b8.<\/p>\n","protected":false},"author":1,"featured_media":600,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-237","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/comments?post=237"}],"version-history":[{"count":1,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":627,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/237\/revisions\/627"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media\/600"}],"wp:attachment":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media?parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/categories?post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/tags?post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}