dataframe-textual 1.12.0__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dataframe_textual/__init__.py +27 -1
- dataframe_textual/__main__.py +9 -2
- dataframe_textual/common.py +118 -50
- dataframe_textual/data_frame_help_panel.py +0 -3
- dataframe_textual/data_frame_table.py +1149 -644
- dataframe_textual/data_frame_viewer.py +27 -4
- dataframe_textual/sql_screen.py +11 -11
- dataframe_textual/table_screen.py +118 -96
- dataframe_textual/yes_no_screen.py +32 -37
- {dataframe_textual-1.12.0.dist-info → dataframe_textual-2.0.0.dist-info}/METADATA +143 -141
- dataframe_textual-2.0.0.dist-info/RECORD +14 -0
- {dataframe_textual-1.12.0.dist-info → dataframe_textual-2.0.0.dist-info}/WHEEL +1 -1
- dataframe_textual-1.12.0.dist-info/RECORD +0 -14
- {dataframe_textual-1.12.0.dist-info → dataframe_textual-2.0.0.dist-info}/entry_points.txt +0 -0
- {dataframe_textual-1.12.0.dist-info → dataframe_textual-2.0.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataframe-textual
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: Interactive terminal viewer/editor for tabular data
|
|
5
5
|
Project-URL: Homepage, https://github.com/need47/dataframe-textual
|
|
6
6
|
Project-URL: Repository, https://github.com/need47/dataframe-textual.git
|
|
@@ -65,7 +65,7 @@ A powerful, interactive terminal-based viewer/editor for CSV/TSV/Excel/Parquet/J
|
|
|
65
65
|
- 📑 **Duplicate Tab** - Create a copy of the current tab with the same data
|
|
66
66
|
- 📌 **Freeze Rows/Columns** - Keep important rows and columns visible while scrolling
|
|
67
67
|
- 🎯 **Cursor Type Cycling** - Switch between cell, row, and column selection modes
|
|
68
|
-
-
|
|
68
|
+
- 📸 **Take Screenshot** - Capture terminal view as a SVG image
|
|
69
69
|
|
|
70
70
|
## Installation
|
|
71
71
|
|
|
@@ -110,7 +110,10 @@ cd dataframe-textual
|
|
|
110
110
|
# Install from local source
|
|
111
111
|
pip install -e .
|
|
112
112
|
|
|
113
|
-
#
|
|
113
|
+
# With Excel support
|
|
114
|
+
pip install -e ".[excel]"
|
|
115
|
+
|
|
116
|
+
# With development dependencies
|
|
114
117
|
pip install -e ".[excel,dev]"
|
|
115
118
|
```
|
|
116
119
|
|
|
@@ -176,7 +179,7 @@ options:
|
|
|
176
179
|
-f, --format {csv,excel,tsv,parquet,json,ndjson}
|
|
177
180
|
Specify the format of the input files
|
|
178
181
|
-H, --no-header Specify that input files have no header row
|
|
179
|
-
-I, --no-
|
|
182
|
+
-I, --no-inference Do not infer data types when reading CSV/TSV
|
|
180
183
|
-E, --ignore-errors Ignore errors when reading CSV/TSV
|
|
181
184
|
-c, --comment-prefix COMMENT_PREFIX
|
|
182
185
|
Comment lines are skipped when reading CSV/TSV (default: skip none)
|
|
@@ -208,7 +211,7 @@ dv -l 3 data_with_meta.csv
|
|
|
208
211
|
# Skip 1 row after header (e.g., units row)
|
|
209
212
|
dv -a 1 data_with_units.csv
|
|
210
213
|
|
|
211
|
-
# Skip comment lines
|
|
214
|
+
# Skip comment lines (or just -c)
|
|
212
215
|
dv -c "#" commented_data.csv
|
|
213
216
|
|
|
214
217
|
# Treat specific values as null/missing (e.g., 'NA', 'N/A', '-')
|
|
@@ -244,10 +247,12 @@ zcat compressed_data.csv.gz | dv -f csv
|
|
|
244
247
|
| `Q` | Close all tabs and app (prompts to save unsaved changes) |
|
|
245
248
|
| `Ctrl+Q` | Force to quit app (regardless of unsaved changes) |
|
|
246
249
|
| `Ctrl+T` | Save current tab to file |
|
|
250
|
+
| `w` | Save current tab to file (overwrite without prompt) |
|
|
247
251
|
| `Ctrl+A` | Save all tabs to file |
|
|
252
|
+
| `W` | Save all tabs to file (overwrite without prompt) |
|
|
248
253
|
| `Ctrl+D` | Duplicate current tab |
|
|
249
254
|
| `Ctrl+O` | Open file in a new tab |
|
|
250
|
-
| `Double-click
|
|
255
|
+
| `Double-click` | Rename tab |
|
|
251
256
|
|
|
252
257
|
#### View & Settings
|
|
253
258
|
|
|
@@ -255,6 +260,7 @@ zcat compressed_data.csv.gz | dv -f csv
|
|
|
255
260
|
|-----|--------|
|
|
256
261
|
| `F1` | Toggle help panel |
|
|
257
262
|
| `k` | Cycle through dark, light and other themes |
|
|
263
|
+
| `Ctrl+P` -> `Screenshot` | Capture terminal view as a SVG image |
|
|
258
264
|
|
|
259
265
|
---
|
|
260
266
|
|
|
@@ -281,7 +287,7 @@ zcat compressed_data.csv.gz | dv -f csv
|
|
|
281
287
|
| `U` | Redo last undone action |
|
|
282
288
|
| `Ctrl+U` | Reset to initial state |
|
|
283
289
|
|
|
284
|
-
####
|
|
290
|
+
#### Display
|
|
285
291
|
|
|
286
292
|
| Key | Action |
|
|
287
293
|
|-----|--------|
|
|
@@ -315,41 +321,45 @@ zcat compressed_data.csv.gz | dv -f csv
|
|
|
315
321
|
| `d` | Duplicate current column (appends '_copy' suffix) |
|
|
316
322
|
| `D` | Duplicate current row |
|
|
317
323
|
|
|
318
|
-
####
|
|
324
|
+
#### Row Selection
|
|
319
325
|
|
|
320
326
|
| Key | Action |
|
|
321
327
|
|-----|--------|
|
|
322
|
-
| `\` |
|
|
323
|
-
| `\|` (pipe) |
|
|
328
|
+
| `\` | Select rows wth cell matches or those matching cursor value in current column |
|
|
329
|
+
| `\|` (pipe) | Select rows by expression |
|
|
324
330
|
| `{` | Go to previous selected row |
|
|
325
331
|
| `}` | Go to next selected row |
|
|
326
|
-
| `/` | Find in current column with cursor value and highlight matching cells |
|
|
327
|
-
| `?` | Find in current column with expression and highlight matching cells |
|
|
328
|
-
| `n` | Go to next matching cell |
|
|
329
|
-
| `N` | Go to previous matching cell |
|
|
330
332
|
| `'` | Select/deselect current row |
|
|
331
333
|
| `t` | Toggle row selections (invert) |
|
|
332
334
|
| `T` | Clear all row selections and/or cell matches |
|
|
333
|
-
| `"` (quote) | Filter to selected rows (and remove others) |
|
|
334
|
-
| `v` | View rows (and hide others) by row selections and/or cell matches or cursor value |
|
|
335
|
-
| `V` | View rows (and hide others) by expression |
|
|
336
|
-
|
|
337
|
-
#### SQL Interface
|
|
338
|
-
|
|
339
|
-
| Key | Action |
|
|
340
|
-
|-----|--------|
|
|
341
|
-
| `l` | Simple SQL interface (select columns & where clause) |
|
|
342
|
-
| `L` | Advanced SQL interface (full SQL query with syntax highlight) |
|
|
343
335
|
|
|
344
336
|
#### Find & Replace
|
|
345
337
|
|
|
346
338
|
| Key | Action |
|
|
347
339
|
|-----|--------|
|
|
340
|
+
| `/` | Find in current column with cursor value and highlight matching cells |
|
|
341
|
+
| `?` | Find in current column with expression and highlight matching cells |
|
|
342
|
+
| `n` | Go to next matching cell |
|
|
343
|
+
| `N` | Go to previous matching cell |
|
|
348
344
|
| `;` | Find across all columns with cursor value |
|
|
349
345
|
| `:` | Find across all columns with expression |
|
|
350
346
|
| `r` | Find and replace in current column (interactive or replace all) |
|
|
351
347
|
| `R` | Find and replace across all columns (interactive or replace all) |
|
|
352
348
|
|
|
349
|
+
#### View & Filter
|
|
350
|
+
| Key | Action |
|
|
351
|
+
|-----|--------|
|
|
352
|
+
| `"` (quote) | Filter selected rows (others removed) |
|
|
353
|
+
| `v` | View selected rows (others hidden) |
|
|
354
|
+
| `V` | View selected by expression (others hidden) |
|
|
355
|
+
|
|
356
|
+
#### SQL Interface
|
|
357
|
+
|
|
358
|
+
| Key | Action |
|
|
359
|
+
|-----|--------|
|
|
360
|
+
| `l` | Simple SQL interface (select columns & where clause) |
|
|
361
|
+
| `L` | Advanced SQL interface (full SQL query with syntax highlight) |
|
|
362
|
+
|
|
353
363
|
#### Sorting (supporting multiple columns)
|
|
354
364
|
|
|
355
365
|
| Key | Action |
|
|
@@ -401,35 +411,23 @@ Press `Enter` on any row to open a modal showing all column values for that row.
|
|
|
401
411
|
Useful for examining wide datasets where columns don't fit well on screen.
|
|
402
412
|
|
|
403
413
|
**In the Row Detail Modal**:
|
|
404
|
-
- Press `v` to **view** all rows containing the selected column value (
|
|
405
|
-
- Press `"` to **filter** all rows containing the selected column value (
|
|
414
|
+
- Press `v` to **view** all rows containing the selected column value (others hidden but preserved)
|
|
415
|
+
- Press `"` to **filter** all rows containing the selected column value (others removed)
|
|
416
|
+
- Press `{` to move to the **previous row** (respects hidden rows)
|
|
417
|
+
- Press `}` to move to the **next row** (respects hidden rows)
|
|
406
418
|
- Press `q` or `Escape` to close the modal
|
|
407
419
|
|
|
408
|
-
### 3.
|
|
420
|
+
### 3. Row Selection
|
|
409
421
|
|
|
410
|
-
The application provides multiple
|
|
422
|
+
The application provides multiple modes for selecting rows (marks it for filtering or viewing):
|
|
411
423
|
|
|
412
|
-
|
|
413
|
-
-
|
|
414
|
-
-
|
|
415
|
-
|
|
416
|
-
**Find Operations** - Find by value/expression and highlight matching cells:
|
|
417
|
-
- `/` - Find cursor value within current column
|
|
418
|
-
- `?` - Open dialog to search current column with expression
|
|
419
|
-
- `;` - Find cursor value across all columns
|
|
420
|
-
- `:` - Open dialog to search all columns with expression
|
|
421
|
-
|
|
422
|
-
**Selection & Filtering**:
|
|
423
|
-
- `'` - Select/deselect current row (marks it for filtering or viewing)
|
|
424
|
+
- `\` - Select rows with cell matches or those matching cursor value in current column (respects data type)
|
|
425
|
+
- `|` - Opens dialog to select rows with custom expression
|
|
426
|
+
- `'` - Select/deselect current row
|
|
424
427
|
- `t` - Flip selections of all rows
|
|
425
428
|
- `T` - Clear all row selections and cell matches
|
|
426
|
-
- `
|
|
427
|
-
- `
|
|
428
|
-
- `V` - **View** rows using custom expression (others hidden but preserved)
|
|
429
|
-
|
|
430
|
-
**Note**:
|
|
431
|
-
- The `"` (Filter) and `v`/`V` (View) operations appear similar but have very different effects on your data. See section 3b "Filter vs. View - Understanding the Difference" for detailed guidance on when to use each.
|
|
432
|
-
- If currently there are no selectet rows and no matching cells, the `"` (Filter) and `v` (View) will use cursor value for search.
|
|
429
|
+
- `{` - Go to previous selected row
|
|
430
|
+
- `}` - Go to next selected row
|
|
433
431
|
|
|
434
432
|
**Advanced Matching Options**:
|
|
435
433
|
|
|
@@ -437,38 +435,23 @@ When searching or finding, you can use checkboxes in the dialog to enable:
|
|
|
437
435
|
- **Match Nocase**: Ignore case differences
|
|
438
436
|
- **Match Whole**: Match complete value, not partial substrings or words
|
|
439
437
|
|
|
440
|
-
These options work with plain text searches. Use Polars regex patterns in expressions for more control
|
|
441
|
-
- **Case-insensitive matching in expressions**: Use `(?i)` prefix in regex (e.g., `(?i)john`)
|
|
442
|
-
- **Word boundaries in expressions**: Use `\b` in regex (e.g., `\bjohn\b` matches whole word)
|
|
438
|
+
These options work with plain text searches. Use Polars regex patterns in expressions for more control. For example, use `(?i)` prefix in regex (e.g., `(?i)john`) for case-insensitive matching.
|
|
443
439
|
|
|
444
440
|
**Quick Tips:**
|
|
445
|
-
- Search results highlight matching rows
|
|
441
|
+
- Search results highlight matching rows in **red**
|
|
442
|
+
- Use expression for advanced selection (e.g., $attack > $defense)
|
|
446
443
|
- Multiple searches **accumulate** - each new search adds to the selections or matches
|
|
447
444
|
- Type-aware matching automatically converts values. Resort to string comparison if conversion fails
|
|
448
445
|
- Use `u` to undo any search or filter
|
|
449
446
|
|
|
450
|
-
###
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
**When to use View** (`v` or `V`):
|
|
460
|
-
- Exploring or analyzing data safely
|
|
461
|
-
- Switching between different perspectives
|
|
462
|
-
- Press `H` to restore hidden rows (and hidden columns)
|
|
463
|
-
|
|
464
|
-
**When to use Filter** (`"`):
|
|
465
|
-
- Cleaning data (removing unwanted rows)
|
|
466
|
-
- Creating a trimmed dataset for export
|
|
467
|
-
- Permanent row removal from your dataframe
|
|
468
|
-
|
|
469
|
-
Both support full undo with `u`.
|
|
470
|
-
|
|
471
|
-
### 4. Replace
|
|
447
|
+
### 4. Find & Replace
|
|
448
|
+
**Find Operations** - Find by value/expression and highlight matching cells:
|
|
449
|
+
- `/` - Find cursor value within current column (respects data type)
|
|
450
|
+
- `?` - Open dialog to search current column with expression
|
|
451
|
+
- `;` - Find cursor value across all columns
|
|
452
|
+
- `:` - Open dialog to search all columns with expression
|
|
453
|
+
- `n` - Go to next matching cell
|
|
454
|
+
- `N` - Go to previous matching cell
|
|
472
455
|
|
|
473
456
|
Replace values in current column (`r`) or across all columns (`R`).
|
|
474
457
|
|
|
@@ -493,9 +476,32 @@ When you press `r` or `R`, enter:
|
|
|
493
476
|
- Type `NULL` to replace null/missing values
|
|
494
477
|
- Use `Match Nocase` for case-insensitive matching
|
|
495
478
|
- Use `Match Whole` to avoid partial replacements
|
|
496
|
-
-
|
|
479
|
+
- Support undo (`u`)
|
|
480
|
+
|
|
481
|
+
### 5. Filter vs. View
|
|
497
482
|
|
|
498
|
-
|
|
483
|
+
Both operations show rows that are selected or contain matching cells, but with fundamentally different effects:
|
|
484
|
+
|
|
485
|
+
| Operation | Keyboard | Effect | Data Preserved |
|
|
486
|
+
|-----------|----------|--------|-----------------|
|
|
487
|
+
| **View** | `v`, `V` | Hides non-matching rows | Yes (hidden, can be restored by `H`) |
|
|
488
|
+
| **Filter** | `"` | Removes non-matching rows | No (permanently deleted) |
|
|
489
|
+
|
|
490
|
+
**When to use View** (`v` or `V`):
|
|
491
|
+
- Exploring or analyzing data safely
|
|
492
|
+
- Switching between different perspectives
|
|
493
|
+
- Press `H` to restore hidden rows (and hidden columns)
|
|
494
|
+
|
|
495
|
+
**When to use Filter** (`"`):
|
|
496
|
+
- Cleaning data (removing unwanted rows)
|
|
497
|
+
- Creating a trimmed dataset for export
|
|
498
|
+
- Permanent row removal from your dataframe
|
|
499
|
+
|
|
500
|
+
**Note**:
|
|
501
|
+
- If currently there are no selected rows and no matching cells, the `"` (Filter) and `v` (View) will use cursor value for search.
|
|
502
|
+
- Both support full undo with `u`.
|
|
503
|
+
|
|
504
|
+
### 6. [Polars Expressions](https://docs.pola.rs/api/python/stable/reference/expressions/index.html)
|
|
499
505
|
|
|
500
506
|
Complex values or filters can be specified via Polars expressions, with the following adaptions for convenience:
|
|
501
507
|
|
|
@@ -503,6 +509,7 @@ Complex values or filters can be specified via Polars expressions, with the foll
|
|
|
503
509
|
- `$_` - Current column (based on cursor position)
|
|
504
510
|
- `$1`, `$2`, etc. - Column by 1-based index
|
|
505
511
|
- `$age`, `$salary` - Column by name (use actual column names)
|
|
512
|
+
- `` $`col name` `` - Column by name with spaces (backtick quoted)
|
|
506
513
|
|
|
507
514
|
**Row References:**
|
|
508
515
|
- `$#` - Current row index (1-based)
|
|
@@ -528,6 +535,7 @@ Complex values or filters can be specified via Polars expressions, with the foll
|
|
|
528
535
|
- `($score >= 80) & ($score <= 90)` - Score between 80 and 90
|
|
529
536
|
- `~($status == 'inactive')` - Status is not inactive
|
|
530
537
|
- `$revenue > $expenses` - Revenue exceeds expenses
|
|
538
|
+
- ``$`product id` > 100`` - Product ID with spaces in column name greater than 100
|
|
531
539
|
|
|
532
540
|
**String Matching:** ([Polars string API reference](https://docs.pola.rs/api/python/stable/reference/series/string.html))
|
|
533
541
|
- `$name.str.contains("John")` - Name contains "John" (case-sensitive)
|
|
@@ -550,14 +558,32 @@ Complex values or filters can be specified via Polars expressions, with the foll
|
|
|
550
558
|
- Use column names that match exactly (case-sensitive)
|
|
551
559
|
- Use parentheses to clarify complex expressions: `($a & $b) | ($c & $d)`
|
|
552
560
|
|
|
553
|
-
###
|
|
561
|
+
### 7. Sorting
|
|
554
562
|
|
|
555
563
|
- Press `[` to sort current column ascending
|
|
556
564
|
- Press `]` to sort current column descending
|
|
557
565
|
- Multi-column sorting supported (press multiple times on different columns)
|
|
558
566
|
- Press same key twice to remove the column from sorting
|
|
559
567
|
|
|
560
|
-
###
|
|
568
|
+
### 8. Dataframe & Column Metadata
|
|
569
|
+
|
|
570
|
+
View quick metadata about your dataframe and columns to understand their structure and content.
|
|
571
|
+
|
|
572
|
+
**Dataframe Metadata** (`m`):
|
|
573
|
+
- Press `m` to open a modal displaying:
|
|
574
|
+
- **Rows** - Total number of rows in the dataframe
|
|
575
|
+
- **Columns** - Total number of columns in the dataframe
|
|
576
|
+
|
|
577
|
+
**Column Metadata** (`M`):
|
|
578
|
+
- Press `M` to open a modal displaying details for all columns:
|
|
579
|
+
- **ID** - 1-based column index
|
|
580
|
+
- **Name** - Column name
|
|
581
|
+
- **Type** - Data type (e.g., Int64, String, Float64, Boolean)
|
|
582
|
+
|
|
583
|
+
**In Metadata Modals**:
|
|
584
|
+
- Press `q` or `Escape` to close
|
|
585
|
+
|
|
586
|
+
### 9. Frequency Distribution
|
|
561
587
|
|
|
562
588
|
Press `F` to see value distributions of the current column. The modal shows:
|
|
563
589
|
- Value, Count, Percentage, Histogram
|
|
@@ -565,8 +591,8 @@ Press `F` to see value distributions of the current column. The modal shows:
|
|
|
565
591
|
|
|
566
592
|
**In the Frequency Table**:
|
|
567
593
|
- Press `[` and `]` to sort by any column (value, count, or percentage)
|
|
568
|
-
- Press `v` to **
|
|
569
|
-
- Press `"` to **
|
|
594
|
+
- Press `v` to **view** all rows containing the selected value (others hidden but preserved)
|
|
595
|
+
- Press `"` to **filter** all rows containing the selected value (others removed)
|
|
570
596
|
- Press `q` or `Escape` to close the frequency table
|
|
571
597
|
|
|
572
598
|
This is useful for:
|
|
@@ -575,17 +601,11 @@ This is useful for:
|
|
|
575
601
|
- Identifying rare or common values
|
|
576
602
|
- Finding the most/least frequent entries
|
|
577
603
|
|
|
578
|
-
###
|
|
579
|
-
|
|
580
|
-
Press `s` to see summary statistics for the current column, or press `S` for statistics across the entire dataframe.
|
|
581
|
-
|
|
582
|
-
**Column Statistics** (`s`):
|
|
583
|
-
- Shows calculated statistics using Polars' `describe()` method
|
|
584
|
-
- Displays: count, null count, mean, median, std, min, max, etc.
|
|
604
|
+
### 10. Column & Dataframe Statistics
|
|
585
605
|
|
|
586
|
-
|
|
587
|
-
-
|
|
588
|
-
-
|
|
606
|
+
Show summary statistics (count, null count, mean, median, std, min, max, etc.) using Polars' `describe()` method.
|
|
607
|
+
- `s` for the current column
|
|
608
|
+
- `S` for all columns across the entire dataframe
|
|
589
609
|
|
|
590
610
|
**In the Statistics Modal**:
|
|
591
611
|
- Press `q` or `Escape` to close the statistics table
|
|
@@ -599,7 +619,7 @@ This is useful for:
|
|
|
599
619
|
- Quick statistical summaries without external tools
|
|
600
620
|
- Comparing statistics across columns
|
|
601
621
|
|
|
602
|
-
###
|
|
622
|
+
### 11. Data Editing
|
|
603
623
|
|
|
604
624
|
**Edit Cell** (`e` or **Double-click**):
|
|
605
625
|
- Opens modal for editing current cell
|
|
@@ -623,41 +643,31 @@ This is useful for:
|
|
|
623
643
|
**Delete Column** (`-`):
|
|
624
644
|
- Removes the entire column from display and dataframe
|
|
625
645
|
|
|
626
|
-
|
|
646
|
+
**Add Empty Column** (`a`):
|
|
647
|
+
- Adds a new empty column after the current column
|
|
648
|
+
- Column is initialized with NULL values for all rows
|
|
627
649
|
|
|
628
|
-
**
|
|
629
|
-
-
|
|
630
|
-
-
|
|
631
|
-
-
|
|
650
|
+
**Add Column with Value/Expression** (`A`):
|
|
651
|
+
- Opens dialog to specify column name and initial value/expression
|
|
652
|
+
- Value can be a constant (e.g., `0`, `"text"`) or a Polars expression (e.g., `$age * 2`)
|
|
653
|
+
- Expression can reference other columns and perform calculations
|
|
654
|
+
- Useful for creating derived columns or adding data with formulas
|
|
632
655
|
|
|
633
|
-
**
|
|
634
|
-
- Restores all previously hidden columns (and hidden rows) to the display
|
|
635
|
-
|
|
636
|
-
### 11. Duplicate Column
|
|
637
|
-
|
|
638
|
-
Press `d` to duplicate the current column:
|
|
656
|
+
**Duplicate Column** (`d`):
|
|
639
657
|
- Creates a new column immediately after the current column
|
|
640
658
|
- New column has '_copy' suffix (e.g., 'price' → 'price_copy')
|
|
641
|
-
-
|
|
642
|
-
- New column is inserted into the dataframe
|
|
659
|
+
- Useful for creating backups before transformation
|
|
643
660
|
|
|
644
|
-
|
|
645
|
-
- Creating backup copies of columns before transformation
|
|
646
|
-
- Working with alternative versions of column data
|
|
647
|
-
- Comparing original vs. processed column values side-by-side
|
|
648
|
-
|
|
649
|
-
### 12. Duplicate Row
|
|
650
|
-
|
|
651
|
-
Press `D` to duplicate the current row:
|
|
661
|
+
**Duplicate Row** (`D`):
|
|
652
662
|
- Creates a new row immediately after the current row
|
|
653
663
|
- Duplicate preserves all data from original row
|
|
654
|
-
-
|
|
664
|
+
- Useful for batch adding similar records
|
|
655
665
|
|
|
656
|
-
|
|
657
|
-
-
|
|
658
|
-
-
|
|
666
|
+
**Hide/Show Columns** (`h` / `H`):
|
|
667
|
+
- `h` - Temporarily hide current column (data preserved)
|
|
668
|
+
- `H` - Restore all hidden columns and rows
|
|
659
669
|
|
|
660
|
-
###
|
|
670
|
+
### 12. Column & Row Reordering
|
|
661
671
|
|
|
662
672
|
**Move Columns**: `Shift+←` and `Shift+→`
|
|
663
673
|
- Swaps adjacent columns
|
|
@@ -667,12 +677,12 @@ This is useful for:
|
|
|
667
677
|
- Swaps adjacent rows
|
|
668
678
|
- Reorder is preserved when saving
|
|
669
679
|
|
|
670
|
-
###
|
|
680
|
+
### 13. Freeze Rows and Columns
|
|
671
681
|
|
|
672
682
|
Press `z` to open the dialog:
|
|
673
683
|
- Enter number of fixed rows and/or columns to keep top rows/columns visible while scrolling
|
|
674
684
|
|
|
675
|
-
### 14.
|
|
685
|
+
### 14. Thousand Separator Toggle
|
|
676
686
|
|
|
677
687
|
Press `,` to toggle thousand separator formatting for numeric data:
|
|
678
688
|
- Applies to **integer** and **float** columns
|
|
@@ -684,10 +694,7 @@ Press `,` to toggle thousand separator formatting for numeric data:
|
|
|
684
694
|
|
|
685
695
|
### 15. Save File
|
|
686
696
|
|
|
687
|
-
Press `Ctrl+S` to save
|
|
688
|
-
- Save filtered, edited, or sorted data back to file
|
|
689
|
-
- Choose filename in modal dialog
|
|
690
|
-
- Confirm if file already exists
|
|
697
|
+
Press `Ctrl+S` to save filtered, edited, or sorted data back to file
|
|
691
698
|
|
|
692
699
|
### 16. Undo/Redo/Reset
|
|
693
700
|
|
|
@@ -736,7 +743,7 @@ Press `K` to cycle through selection modes:
|
|
|
736
743
|
The SQL interface provides two modes for querying your dataframe:
|
|
737
744
|
|
|
738
745
|
#### Simple SQL Interface (`l`)
|
|
739
|
-
|
|
746
|
+
SELECT specific columns and apply WHERE conditions without writing full SQL:
|
|
740
747
|
- Choose which columns to include in results
|
|
741
748
|
- Specify WHERE clause for filtering
|
|
742
749
|
- Ideal for quick filtering and column selection
|
|
@@ -752,23 +759,21 @@ Execute complete SQL queries for advanced data manipulation:
|
|
|
752
759
|
**Examples:**
|
|
753
760
|
```sql
|
|
754
761
|
-- Filter and select specific rows and/or columns
|
|
755
|
-
SELECT name, age
|
|
756
|
-
|
|
757
|
-
-- Aggregate with GROUP BY
|
|
758
|
-
SELECT department, COUNT(*) as count, AVG(salary) as avg_salary
|
|
762
|
+
SELECT name, age
|
|
759
763
|
FROM self
|
|
760
|
-
|
|
764
|
+
WHERE age > 30
|
|
761
765
|
|
|
762
|
-
--
|
|
766
|
+
-- Use backticks (`) for column names with spaces
|
|
763
767
|
SELECT *
|
|
764
768
|
FROM self
|
|
765
|
-
WHERE
|
|
769
|
+
WHERE `product id` = 7
|
|
766
770
|
```
|
|
767
771
|
|
|
768
772
|
### 20. Clipboard Operations
|
|
769
773
|
|
|
770
|
-
Copies value to system clipboard with `pbcopy` on macOS and `xclip` on Linux
|
|
771
|
-
|
|
774
|
+
Copies value to system clipboard with `pbcopy` on macOS and `xclip` on Linux.
|
|
775
|
+
|
|
776
|
+
**Note** May require a X server to work.
|
|
772
777
|
|
|
773
778
|
- Press `c` to copy cursor value
|
|
774
779
|
- Press `Ctrl+C` to copy column values
|
|
@@ -783,16 +788,11 @@ Press `@` to create a new column containing dynamically generated URLs using tem
|
|
|
783
788
|
|
|
784
789
|
The link template supports multiple placeholder types for maximum flexibility:
|
|
785
790
|
|
|
786
|
-
- **`$_`** - Current column (the column where cursor was when `@` was pressed)
|
|
787
|
-
- Example: `https://example.com/search/$_` - Uses values from the current column
|
|
791
|
+
- **`$_`** - Current column (the column where cursor was when `@` was pressed), e.g., `https://example.com/search/$_` - Uses values from the current column
|
|
788
792
|
|
|
789
|
-
- **`$1`, `$2`, `$3`, etc.** - Column by 1-based position index
|
|
790
|
-
- Example: `https://example.com/product/$1/details/$2` - Uses 1st and 2nd columns
|
|
791
|
-
- Index corresponds to column display order (left-to-right)
|
|
793
|
+
- **`$1`, `$2`, `$3`, etc.** - Column by 1-based position index, e.g., `https://example.com/product/$1/details/$2` - Uses 1st and 2nd columns
|
|
792
794
|
|
|
793
|
-
- **`$name`** - Column by name (use actual column names)
|
|
794
|
-
- Example: `https://pubchem.ncbi.nlm.nih.gov/search?q=$product_id` - Uses `product_id` column
|
|
795
|
-
- Example: `https://example.com/$region/$city/data` - Uses `region` and `city` columns
|
|
795
|
+
- **`$name`** - Column by name (use actual column names), e.g., `https://example.com/$region/$city/data` - Uses `region` and `city` columns
|
|
796
796
|
|
|
797
797
|
**Features:**
|
|
798
798
|
- **Multiple Placeholders**: Mix and match placeholders in a single template
|
|
@@ -812,10 +812,12 @@ Manage multiple files and dataframes simultaneously with tabs.
|
|
|
812
812
|
- **`<`** - Move to previous tab
|
|
813
813
|
- **`b`** - Cycle through tabs
|
|
814
814
|
- **`B`** - Toggle tab bar visibility
|
|
815
|
-
- **`Double-click
|
|
815
|
+
- **`Double-click`** - Rename the tab
|
|
816
816
|
- **`Ctrl+D`** - Duplicate current tab (creates a copy with same data and state)
|
|
817
817
|
- **`Ctrl+T`** - Save current tab to file
|
|
818
|
+
- **`w`** - Save current tab to file (overwrite without prompt)
|
|
818
819
|
- **`Ctrl+A`** - Save all tabs in a single Excel file
|
|
820
|
+
- **`W`** - Save all tabs to file (overwrite without prompt)
|
|
819
821
|
- **`q`** - Close current tab (closes tab, prompts to save if unsaved changes)
|
|
820
822
|
- **`Q`** - Close all tabs and exit app (prompts to save tabs with unsaved changes)
|
|
821
823
|
- **`Ctrl+Q`** - Force to quit app regardless of unsaved changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
dataframe_textual/__init__.py,sha256=E53fW1spQRA4jW9grxSqPEmoe9zofzr6twdveMbt_W8,1310
|
|
2
|
+
dataframe_textual/__main__.py,sha256=vgHjpSsHBF34UN46iMgu_EiebZUzxWwJZ_ngOU3nQvI,3412
|
|
3
|
+
dataframe_textual/common.py,sha256=gpNNY5ZePJkJPf-YoLSCHKaBpdXQ1yW2iSKYV6zZYUo,27908
|
|
4
|
+
dataframe_textual/data_frame_help_panel.py,sha256=UEtj64XsVRdtLzuwOaITfoEQUkAfwFuvpr5Npip5WHs,3381
|
|
5
|
+
dataframe_textual/data_frame_table.py,sha256=4tnE6apxQ_EJoSvFwq4ZuDqKTHSBUcQVFYSDbweIK98,147612
|
|
6
|
+
dataframe_textual/data_frame_viewer.py,sha256=fkiQ0OGi2rrE06VAVJuAM_9wwmqLY1AZouwEMNoDmy8,22367
|
|
7
|
+
dataframe_textual/sql_screen.py,sha256=P3j1Fv45NIKEYo9adb7NPod54FaU-djFIvCUMMHbvjY,7534
|
|
8
|
+
dataframe_textual/table_screen.py,sha256=XlVxU_haCxPoA41ZIDcwixOg341Wf35JrFwPoCTnMzE,19033
|
|
9
|
+
dataframe_textual/yes_no_screen.py,sha256=NI7Zt3rETDWYiT5CH_FDy7sIWkZ7d7LquaZZbX79b2g,26400
|
|
10
|
+
dataframe_textual-2.0.0.dist-info/METADATA,sha256=9prx6qymZRsp42WCJbl1S9qluBkY2IBRDMN-JHiBL_U,29306
|
|
11
|
+
dataframe_textual-2.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
12
|
+
dataframe_textual-2.0.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
|
|
13
|
+
dataframe_textual-2.0.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
|
|
14
|
+
dataframe_textual-2.0.0.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
dataframe_textual/__init__.py,sha256=IFPb8RMUgghw0eRomehkkC684Iny_gs1VkiZMQ5ZpFk,813
|
|
2
|
-
dataframe_textual/__main__.py,sha256=VRH80gWJGLxfURg1GiN3cwWI7O_TQM5PqhqXbUCC1bg,3253
|
|
3
|
-
dataframe_textual/common.py,sha256=g_kMgph84ush-FLgclxYKL9PF9l9hRPMk-AVfZEWGSo,25416
|
|
4
|
-
dataframe_textual/data_frame_help_panel.py,sha256=iEKaur-aH1N_oqHu-vMwEEjfkjQiThK24UO5izsOiW0,3416
|
|
5
|
-
dataframe_textual/data_frame_table.py,sha256=hAbqT3m8BAtanPOS2Wk_1YelynT1-y50oVXyHNY5gmE,128235
|
|
6
|
-
dataframe_textual/data_frame_viewer.py,sha256=3r7vy3zlcqxcqzDafMK22Rcw_3mkdHmNit3avXXgXlI,21246
|
|
7
|
-
dataframe_textual/sql_screen.py,sha256=Pk2ENyDVkOXBLcsEMeXOEMkdzRH_NJ3T1biVUcY8j4Q,7411
|
|
8
|
-
dataframe_textual/table_screen.py,sha256=IhaGAWjzXaLvvc4JLBlAM6_Hl3t7du7vuHQYhrvW_5o,18055
|
|
9
|
-
dataframe_textual/yes_no_screen.py,sha256=qbuhywLIGBL52zQfSGVZQCfsdSmDz9JH6C4YFLrLYKU,26233
|
|
10
|
-
dataframe_textual-1.12.0.dist-info/METADATA,sha256=tNT_ZtTFSKkEJFjXcC9inRozV0mSL8k5s213VEqJmu4,29313
|
|
11
|
-
dataframe_textual-1.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
12
|
-
dataframe_textual-1.12.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
|
|
13
|
-
dataframe_textual-1.12.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
|
|
14
|
-
dataframe_textual-1.12.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|