wp231957 发表于 2024-11-15 14:58:26

FishC 发表于 2024-11-15 14:51
要对 DataFrame 的列进行升序和降序排序并获取两个新 DataFrame,你可以使用 Pandas 的 `sort_values`...

现在的需求修正为

import pandas as pd

df = pd.read_excel('5.xlsx',header=None)
# 对于升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 对于降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)
outls=[]
outls.append(df1的1--3,df2的1--3)
outls.append(df1的4--6,df2的4--6)
outls.append(df1的7--9,df2的7--9)
.......
.......
.......
总共追加42次 结束

FishC 发表于 2024-11-15 14:58:38

wp231957 发表于 2024-11-15 14:58
现在的需求修正为

import pandas as pd

df = p ...

要实现这个功能,你可以创建一个新的列表 `outls`,然后按照需求从两个排序后的 DataFrame 中提取特定的行进行追加。以下是实现代码:

import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等
    group = pd.concat(, df2.iloc])
    # 将结果组合转为列表并加入到 outls
    outls.append(group)

# 输出结果
for idx, group in enumerate(outls, start=1):
    print(f"Group {idx}:\n{group}\n")

说明:
- 使用 `pd.concat` 来合并从 `df1` 和 `df2` 中提取的子 DataFrame。
- `iloc` 用于子集选取,确保每次提取三行。
- 通过循环进行多次合并,把结果加入 `outls`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-11-15 15:05:06

FishC 发表于 2024-11-15 14:58
要实现这个功能,你可以创建一个新的列表 `outls`,然后按照需求从两个排序后的 DataFrame 中提取特定 ...

如果我只想要数据呢   不想要组(group)
group = pd.concat(, df2.iloc])
    # 将结果组合转为列表并加入到 outls
    outls.append(group)
结果中 不想包含index 也不想包含字段名

FishC 发表于 2024-11-15 15:05:16

wp231957 发表于 2024-11-15 15:05
如果我只想要数据呢   不想要组(group)
group = p ...

如果你只想要数据,而不需要索引或字段名,可以在将数据添加到 `outls` 前,将其转换为 NumPy 数组或直接提取值。这样会去掉 DataFrame 的索引和列名。下面是如何实现的:

import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等,并获取纯数据
    group_data = pd.concat(, df2.iloc]).values
    # 直接将 NumPy 数组添加到列表中
    outls.append(group_data)

# 输出结果
for idx, group_data in enumerate(outls, start=1):
    print(f"Data {idx}:\n{group_data}\n")

说明:
- `.iloc` 提取特定的行。
- `.values` 将 DataFrame 转换为 NumPy 数组,去除数据的索引和列名。
- 结果中的每个 `group_data` 是一个二维的 NumPy 数组,仅包含数据本身。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-11-15 15:10:36

FishC 发表于 2024-11-15 15:05
如果你只想要数据,而不需要索引或字段名,可以在将数据添加到 `outls` 前,将其转换为 NumPy 数组或直 ...

dtype=object), array    这些东西 也不想要呢
只是单纯的数据   每6个数据构成一个元组   42个元组 构成一个列表即最终结果

FishC 发表于 2024-11-15 15:10:45

wp231957 发表于 2024-11-15 15:10
dtype=object), array    这些东西 也不想要呢
只是 ...

好的,你希望每6个数据构成一个元组,然后这些元组构成一个列表。这样处理时,可以使用 `.tolist()` 方法将每个 NumPy 数组转换成纯 Python 数据。以下是实现代码:

import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('5.xlsx', header=None)

# 升序排序
df1 = df.sort_values(by=0, ascending=True).reset_index(drop=True)

# 降序排序
df2 = df.sort_values(by=0, ascending=False).reset_index(drop=True)

# 初始化一个空列表来存储结果
outls = []

# 按照需求从 df1 和 df2 中提取并组合数据,共 42 次
for i in range(42):
    # 计算每次的起始索引
    start_idx = i * 3
    # 从 df1 和 df2 中提取1-3行、4-6行等,并生成元组
    group_tuple = tuple(df1.iloc.tolist() + df2.iloc.tolist())
    # 添加元组到列表
    outls.append(group_tuple)

# 输出结果
print(outls)

说明:
- `df1.iloc.tolist()` 提取 DataFrame 列中的前3行并将其转为列表。
- `+` 运算符用于合并两个列表。
- `tuple()` 将合并后的列表转换为元组。
- `outls` 是一个包含42个元组的列表,每个元组由6个数据组成。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-11-18 12:48:30

FishC 发表于 2024-11-15 15:10
好的,你希望每6个数据构成一个元组,然后这些元组构成一个列表。这样处理时,可以使用 `.tolist()` 方 ...

>>> df
          客户单号      客户发货时间                                 收货地址    总件数   重量(T)   体积
0   80037236992024-09-22                  广东省佛山市高明区更合镇合塘路184号   80.0   2.000   4.00
1   80037237052024-09-23                              朱村大道中491号   80.0   2.000   4.00
2   80037237102024-09-23                     广东省惠州市博罗县麻陂镇大马路80号   80.0   0.100   4.00
3   80037237102024-09-23                     广东省惠州市博罗县麻陂镇大马路80号   80.0   0.100   4.00
4   80037262752024-09-22                  广东省广州市南沙区榄核镇大坳村工业B区200.0   5.00010.00
5   80037262792024-09-22                      广东省佛山市高明区更合镇金腾路1号   80.0   2.000   4.00
6   80037277272024-09-26                   广东省惠州市惠阳区大亚湾澳头荃湾综合港区400.010.00020.00
7   80037440092024-09-19                     广东省广州市白云区鸦岗金沙围路11号   25.0   0.500   1.00
8   80037440102024-09-20               广东省东莞市麻涌镇麻涌镇新沙工业区海力饲料厂150.0   3.000   6.00
9   80037440102024-09-20               广东省东莞市麻涌镇麻涌镇新沙工业区海力饲料厂150.0   0.100   6.00
1080037462322024-09-23                     广东省佛山市高明区荷城街道三洲兴盛路200.0   5.00010.00
1180037476132024-09-20                  广东省佛山市高明区更合镇合塘路184号408.0   0.01020.40
1280037461132024-09-22                  广东省广州市南沙区榄核镇大坳村工业B区400.010.00020.00
1380037476112024-09-20                      广东省江门市开平市金鸡镇文乐街1号320.0   8.00016.00
1480037476122024-09-20                  广东省佛山市高明区更合镇合塘路184号   32.0   0.800   1.60
1580037475902024-09-21                      广东省云浮市新兴县车岗镇工业开发区100.0   2.000   4.00
1680037462332024-09-20                  广东省广州市黄埔区横沙白街172号101房   50.0   1.000   2.00
1780037464322024-09-23广东省江门市蓬江区杜阮镇怡景大道振林饲料有限公司 江门 Guangdong160.0   4.000   8.00
1880037482352024-09-22               广东省云浮市新兴县东成镇十里工业区联营饲料厂800.020.00040.00
1980037482422024-09-22                     广东省云浮市郁南县大湾镇小桥头工业区720.018.00036.00
2080037482402024-09-22                      广东省云浮市新兴县车岗镇工业开发区200.0   5.00010.00
2180037482382024-09-22                         广东省云浮市新兴县勒竹镇榄根400.010.00020.00
2280037482362024-09-22         广东省佛山市高明区更合镇高明温氏饲料厂Guangdong600.015.00030.00
2380037482372024-09-22                      广东省云浮市新兴县稔村镇白土开发区360.0   9.00018.00
2480037482412024-09-22                   广东省佛山市三水区南山镇六和镇城东路1号640.016.00032.00

已知以上数据,现在需求:
要求把收货地址中包含    东莞或者惠州或者佛山 的并且日期一致的记录合并重量字段求和

FishC 发表于 2024-11-18 12:48:44

wp231957 发表于 2024-11-18 12:48
>>> df
          客户单号      客户发货时间       ...

要将包含特定关键字的收货地址合并,并对同一天的重量进行求和,你可以使用 Pandas 的 `groupby` 和 `agg` 方法。首先,你需要筛选出地址中包含关键字 "东莞"、"惠州"、"佛山" 的记录,然后按照日期进行分组和求和。以下是示例代码:

import pandas as pd

# 假设已读取数据为 df
df = pd.read_excel('5.xlsx')

# 筛选出地址包含 "东莞"、"惠州" 或 "佛山" 的记录
keywords = ['东莞', '惠州', '佛山']
filtered_df = df.str.contains('|'.join(keywords))]

# 按客户发货时间分组,求重量的和
result_df = filtered_df.groupby('客户发货时间', as_index=False).agg({'重量(T)': 'sum'})

print(result_df)

说明:
- `str.contains('|'.join(keywords))`: 使用正则表达式将多个关键字用“或”条件连接,筛选包含这些关键字的记录。
- `groupby('客户发货时间')`: 根据日期进行分组。
- `.agg({'重量(T)': 'sum'})`: 对每个分组中的重量求和。
- `as_index=False`: 保证分组字段作为普通列返回,而不是索引。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-11-18 12:53:59

FishC 发表于 2024-11-18 12:48
要将包含特定关键字的收货地址合并,并对同一天的重量进行求和,你可以使用 Pandas 的 `groupby` 和 `a ...

其他的数据也是需要的,正常按照日期分组 然后追加到这个结果当中

FishC 发表于 2024-11-18 12:55:17

wp231957 发表于 2024-11-18 12:53
其他的数据也是需要的,正常按照日期分组 然后追加到 ...

如果需要保留其他数据,并按照日期分组,然后为一个含有特定地址的组合数据追加其他数据,可以通过 Pandas 的 `groupby` 和 `agg` 方法来进行处理。你可以对非聚合字段使用 `first`(或者其他需要的操作例如 `list` 等)来保持信息。以下是一个实现示例:

import pandas as pd

# 假设数据已读入并存在于 df 中
df = pd.read_excel('5.xlsx')

# 筛选出地址包含 "东莞"、"惠州" 或 "佛山" 的记录
keywords = ['东莞', '惠州', '佛山']
filtered_df = df.str.contains('|'.join(keywords))]

# 基于日期合并信息
result_df = filtered_df.groupby('客户发货时间', as_index=False).agg({
    '客户单号': 'first',    # 如果同一天有多个,可以用 'list' 来保留所有值
    '收货地址': 'first',   # 类似地,'list' 可以保留所有地址
    '总件数': 'sum',
    '重量(T)': 'sum',
    '体积': 'sum'
})

# 若原始数据中没有过滤掉的,也按照日期汇总,可以通过 append 的方法追加上
other_records = df[~df['收货地址'].str.contains('|'.join(keywords))]
other_grouped = other_records.groupby('客户发货时间', as_index=False).agg({
    '客户单号': 'first',
    '收货地址': 'first',
    '总件数': 'sum',
    '重量(T)': 'sum',
    '体积': 'sum'
})

# 把两个结果合并起来
final_result = pd.concat(, ignore_index=True)

print(final_result)

说明:
- `groupby` 用于按日期分组。
- 对于希望保持在最终结果中的其他信息(比如客户单号、收货地址等),可以选择在 `agg` 方法中使用 `'first'`,而对于需要合计的数值列使用 `'sum'`。
- `pd.concat` 方法将包含特定地址的组合数据和其他数据合在一起,形成最终的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-11-19 14:05:18

FishC 发表于 2024-11-18 12:55
如果需要保留其他数据,并按照日期分组,然后为一个含有特定地址的组合数据追加其他数据,可以通过 Pan ...

现在有这样一组数据
ADAKLDJ
DKJLAKSDJKA
SDJKLSAJKLAJD
SDJKLSDJDKLSA
DKLSDAJF;SASDL
AJDKL;DSAJKLAJ
DJFKLAJDFKLSA
FDSJKLFJSADLKDJFA
SDJFKLSDAJFKLSA
DJFKLSDADFJKLASDF
AJDKFJSADKFA
SDJFKSAJDFKLAS
DFJKSLAJDFKLA
DFSKALJSDFKLDFJPDFO
;SDJFJALSDKJF
ADJIIPQEURFLIAJSD'FJSADKL
QDFJALKJDFKL'Q
WEJKF

要求使用pandas 对每一行进行单独排序

FishC 发表于 2024-11-19 14:05:32

wp231957 发表于 2024-11-19 14:05
现在有这样一组数据
ADAKLDJ
DKJLAKSDJKA
SDJKLSAJ ...

可以使用 Pandas 的 `apply` 方法对 DataFrame 的每一行(或者特定列)进行操作。在您的场景中,需要对每一行的数据进行字符排序。以下是实现的方法:

import pandas as pd

# 假设数据已经以列表形式存在
data = [
    "ADAKLDJ",
    "DKJLAKSDJKA",
    "SDJKLSAJKLAJD",
    "SDJKLSDJDKLSA",
    "DKLSDAJF;SASDL",
    "AJDKL;DSAJKLAJ",
    "DJFKLAJDFKLSA",
    "FDSJKLFJSADLKDJFA",
    "SDJFKLSDAJFKLSA",
    "DJFKLSDADFJKLASDF",
    "AJDKFJSADKFA",
    "SDJFKSAJDFKLAS",
    "DFJKSLAJDFKLA",
    "DFSKALJSDFKLDFJPDFO",
    ";SDJFJALSDKJF",
    "ADJIIPQEURFLIAJSD'FJSADKL",
    "QDFJALKJDFKL'Q",
    "WEJKF"
]

# 创建 DataFrame
df = pd.DataFrame(data, columns=['Text'])

# 对每一行的每个字符串进行排序
df['Sorted_Text'] = df['Text'].apply(lambda x: ''.join(sorted(x)))

# 输出结果
print(df['Sorted_Text'])

说明:
1. 使用 `pd.DataFrame` 将数据转化为 DataFrame。
2. 使用 `apply` 方法对列中的每个字符串应用 `sorted` 函数,然后用 `''.join()` 将排序后的字符重新组合成字符串。
3. 结果存储在新的列 `Sorted_Text` 中。

这样,每一行的字符都会被单独排序并保存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 [2]
查看完整版本: pandas 保留数据